c# – 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<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;
    }
}

并将其用作:

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

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

编辑:争论验证急切.

相关文章
相关标签/搜索