我对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"。
答案 0 :(得分:7)
predicate(item, index)
定义为
类型Func<TSource, int, bool>
表示参数为TSource
和int
且返回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时,您说“将它添加到我的返回集合”