使用Linq选择列表中的一系列成员

Cli*_*rce 9 c# linq

给出一个像这样的元素列表:

int[] ia = new int[] { -4, 10, 11, 12, 13, -1, 9, 8, 7, 6, 5, 4, -2, 
                        6, 15, 32, -5, 6, 19, 22 };
Run Code Online (Sandbox Code Playgroud)

Linq是否有一种简单的方法可以按照"从-1到下一个负数(或列表耗尽)中选择元素"的方式做什么?-1的成功结果是(-1,9,8,7,6,5,4).使用-2将给出结果(-2,6,15,32).

不是作业问题.我只是在寻找一个实现使用bool,一for环,和if如果有一个更清洁的方式做到这一点不知道.

Eri*_*kel 11

看看TakeWhile Linq扩展方法.只要条件为真,就从列表中获取项目,跳过其余项目.

例:

int[] ia = new int[] { -4, 10, 11, 12, 13, -1, 9, 8, 7, 6, 5, 4, -2, 
                        6, 15, 32, -5, 6, 19, 22 };

var result = ia
             .SkipWhile(i => i != -1)
             .Skip(1)
             .TakeWhile(i => i >= 0);
Run Code Online (Sandbox Code Playgroud)

注意SkipWhile之后的Skip(1).SkipWhile会跳过所有内容,但不包括匹配元素.TakeWhile然后采取项目,但不包括匹配元素.因为-1不大于或等于零,所以得到一个空结果.

  • 我更喜欢这个答案,因为它更容易理解.这可以通过将.Skip(1)更改为.Take(1)来提供正确的完整结果. (2认同)

And*_*bel 5

更新

这次我测试了代码......使用TakeWhile的两个参数形式,(j == 0)即使i不满足测试,我们也可以强制它接受第一个元素.

ia.SkipWhile(i => i != -1).TakeWhile((i, j) => i >= 0 || j == 0)

TakeWhile(Func<int, int, bool>)需要一个带有两个参数的函数/ lambda.第一个是要测试的值,第二个是元素的索引.