gpt4 book ai didi

c# - 这两个 linq 实现有什么区别?

转载 作者:行者123 更新时间:2023-11-30 20:10:42 25 4
gpt4 key购买 nike

我正在浏览 Jon Skeet's Reimplemnting Linq to Objects series .在implementation of where文章中,我找到了以下片段,但我不明白将原始方法一分为二的优势是什么。

原始方法:

// Naive validation - broken! 
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
if (predicate == null)
{
throw new ArgumentNullException("predicate");
}
foreach (TSource item in source)
{
if (predicate(item))
{
yield return item;
}
}
}

重构方法:

public static IEnumerable<TSource> Where<TSource>( 
this IEnumerable<TSource> source,
Func<TSource, bool> predicate)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
if (predicate == null)
{
throw new ArgumentNullException("predicate");
}
return WhereImpl(source, predicate);
}

private static IEnumerable<TSource> WhereImpl<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate)
{
foreach (TSource item in source)
{
if (predicate(item))
{
yield return item;
}
}
}

Jon 说 - 它用于急切验证,然后推迟其余部分。但是,我不明白。

有人可以更详细地解释一下吗,这两个函数之间有什么区别,为什么会急切地在其中一个而不是另一个中执行验证?

结论/解决方案:

I got confused due to my lack of understanding on which functions are determined to be iterator-generators. I assumed that, it is based on signature of a method like IEnumerable<T>. But, based on the answers, now I get it, a method is an iterator-generator if it uses yield statements.

最佳答案

损坏的代码是单个方法,实际上是一个迭代器生成器。这意味着它最初只是返回一个状态机而不做任何事情。仅当调用代码调用 MoveNext 时(可能作为 for-each 循环的一部分)它是否执行从开始到第一个 yield-return 的所有内容。

使用正确的代码,Where 不是迭代器-生成器。这意味着它会像往常一样立即执行所有操作。只有 WhereImpl 是。因此验证会立即执行,但直到并包括第一个 yield 返回的 WhereImpl 代码被推迟。

所以如果你有这样的东西:

IEnumerable<int> evens = list.Where(null); // Correct code gives error here.
foreach(int i in evens) // Broken code gives it here.

在您开始迭代之前,损坏的版本不会给您错误。

关于c# - 这两个 linq 实现有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4675107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com