Lambda "select between"

3

我有一个通用的字符串列表,看起来像这样:

List<string> list = new List<string>();

list.Add("foo");
list.Add("1");
list.Add("2");
list.Add("bar");
list.Add("foo");
list.Add("1");
list.Add("2");
list.Add("3");
list.Add("bar");

我想知道是否有办法选择两个值之间的内容。在这种情况下,我需要选择 "1"、"2" 和 "3"。换句话说,我想要选择最后一个 "foo" 和 "bar" 之间的所有内容,或者如果更容易的话,选择 "foo" 后的 N 行。

我最好的猜测是使用 TakeWhile 方法,但我需要你的帮助。

2个回答

2

使用LINQ获取最后一个元素通常有些棘手。既然您已经有了List,我建议直接使用LastIndexOf

int end = list.LastIndexOf("foo");

list.Skip(end + 1).TakeWhile(x => x != "bar")

谢谢,有没有办法在这里使用“StartsWith”方法?这样我就可以得到所有以“foo”开头的行了吗? - Johan
1
@Johan:你应该使用FindLastIndex而不是LastIndexOf,就像Eugene的回答中所示:int end = list.FindLastIndex(x => x.StartsWith("foo")); - Ry-

2
我会这样使用(如果“bar”在“foo”后不总是存在):

我会这样使用(如果“bar”在“foo”后不总是存在):

var start = list.FindLastIndex(i => i == "foo");
var end = list.FindLastIndex(i => i == "bar");

if(start != -1 && end != -1){
    var result = list.Skip(start + 1).Take(end - start - 1);
}

或者是这样的:
var start = list.FindLastIndex(i => i == "foo");
var end = list.FindLastIndex(i => i == "bar");

if(start != -1 && end != -1){
    var result = list.GetRange(start + 1, end - start - 1);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接