什么是LINQ中的"if(谓词(项,索引))"操作?

Voo*_*ild 1 c# linq

我是LINQ的新手.我正在看这段代码,不确定我是否理解这一点.我意识到它是一个扩展和泛型方法,但正在predicate(item, index)执行什么(假设我在调用此方法时传入一个int数组)?

我知道谓词是一个委托,但也许我只是不知道委托如何运作,有人有任何他们想要给出的好的例子/解释.另外,什么是yield关键字,它只是用于linq的东西?

private static IEnumerable<TSource> WhereImpl<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, int, bool> predicate)
{
    int index = 0;
    foreach (TSource item in source)
    {
        if (predicate(item, index))
        {
            yield return item;
        }
        index++;
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图跟随Reimplementing LINQ to Objects:第2部分 -来自Skeet博客的"Where".

Bro*_*ass 7

predicate(item, index)
Run Code Online (Sandbox Code Playgroud)

被定义为类型

Func<TSource, int, bool>
Run Code Online (Sandbox Code Playgroud)

这意味着一个方法,其参数为TSource和,int并返回bool- 谓词.

TSource=的一个例子string可以(完全组成):

bool IsLengthLargerThan(string s, int length)
{
  return s.Length > length;
}
Run Code Online (Sandbox Code Playgroud)

什么是yield关键字,它只用于linq的东西?

yield特定于迭代器块 - 这在LINQ之前就已存在.它基本上像状态机一样工作 - yield return item;将项目返回给调用者并暂停执行,但是一旦你请求下一个项目,执行将在下一行继续.如果您使用调试器逐步完成它,最简单的方法是查看它是如何工作的.