ili*_*ian 4 c# linq linq-to-objects
我需要跳过匹配谓词的第一个元素作为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;
}
});
Run Code Online (Sandbox Code Playgroud)
哪个有效(我认为),但不是很优雅.有没有更清洁的方法来实现这一目标?
你可以编写一个迭代器块扩展方法:
public static IEnumerable<T> SkipFirstMatching<T>
(this IEnumerable<T> source, Func<T, bool> predicate)
{
if (source == null)
throw new ArgumentNullException("source");
if (predicate == null)
throw new ArgumentNullException("predicate");
return SkipFirstMatchingCore(source, predicate);
}
private static IEnumerable<T> SkipFirstMatchingCore<T>
(IEnumerable<T> source, Func<T, bool> predicate)
{
bool itemToSkipSeen = false;
foreach (T item in source)
{
if (!itemToSkipSeen && predicate(item))
itemToSkipSeen = true;
else yield return item;
}
}
Run Code Online (Sandbox Code Playgroud)
并将其用作:
var list = new [] { 1,2,3,4,5,6,7,8,9 };
var skipFirstEvenNumber = list.SkipFirstMatching(i => i % 2 == 0);
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您当前的代码似乎根本不正确.调用该变量skipFirstEvenNumber
,但查询正在跳过奇数.其次,您似乎尝试使用副作用来使查询起作用,但您只是设置标志变量,而不是读取它.因此,您当前的代码应该像普通代码一样工作SkipWhile
.
编辑:争论验证急切.