Linq首先跳到哪里(linq到对象)

我需要跳过匹配谓词的第一个元素作为linq查询。 到目前为止,我可以告诉我能做的最好的事情是这样的:

var list = new [] {1,2,3,4,5,6,7,8,9}; var skippedFirstOdd = false; var skipFirstEvenNumber = list.SkipWhile(number => { if(number % 2 != 0) { skippedFirst = true; return true; } else { return false; } }); 

哪个有效(我认为),但不是很优雅。 有没有更清洁的方法来实现这一目标?

你可以编写一个迭代器块扩展方法:

 public static IEnumerable SkipFirstMatching (this IEnumerable source, Func predicate) { if (source == null) throw new ArgumentNullException("source"); if (predicate == null) throw new ArgumentNullException("predicate"); return SkipFirstMatchingCore(source, predicate); } private static IEnumerable SkipFirstMatchingCore (IEnumerable source, Func predicate) { bool itemToSkipSeen = false; foreach (T item in source) { if (!itemToSkipSeen && predicate(item)) itemToSkipSeen = true; else yield return item; } } 

并将其用作:

 var list = new [] { 1,2,3,4,5,6,7,8,9 }; var skipFirstEvenNumber = list.SkipFirstMatching(i => i % 2 == 0); 

顺便说一句,您当前的代码似乎根本不正确。 该变量名为skipFirstEvenNumber ,但查询正在跳过奇数 。 其次,您似乎尝试使用副作用来使查询起作用,但您只是设置标志变量,而不是读取它。 因此,您当前的代码应该像普通的SkipWhile一样工作。

编辑 :争论validation急切。