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

时间:2011-03-21 18:20:02

标签: 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++;
    }
}

我正在尝试关注Skeet博客中的Reimplementing LINQ to Objects: Part 2 - "Where"

3 个答案:

答案 0 :(得分:7)

predicate(item, index)

定义为

类型
Func<TSource, int, bool>

表示参数为TSourceint且返回bool - 谓词的方法。

TSource = string的示例可以(完全弥补):

bool IsLengthLargerThan(string s, int length)
{
  return s.Length > length;
}
  

另外,什么是yield关键字,是吗?   刚刚用于linq的东西?

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

答案 1 :(得分:0)

首先,predicate(item, index)是一个委托,它接受枚举中的项目和枚举中该项目的索引。因此,如果您从一个整数数组开始,该项将是一个整数,索引将是它在数组中的索引。此索引是枚举的当前实例的结果,因此,如果添加Where子句并且项的原始索引为3,并且过滤掉前3个,则其新索引将为0.

yield关键字是一个C#关键字,可以轻松输出IEnumerable。

答案 2 :(得分:0)

predicate(..)是一个函数,它接受2个参数,一个字符串和一个int,并返回true或false。 yield return是一个关键字,基本上就像是在说“是的,将它添加到我将要返回的IEnumerable中,但让我们继续寻找其他人”

因此它使用字符串和int执行predicate函数。您看到索引已初始化为0并且每次都自动递增。这是谓词的第二个参数。当函数返回true时,您说“将它添加到我的返回集合”