LINQ versus yield
本文关键字:yield versus LINQ | 更新日期: 2023-09-27 18:12:18
我几乎不使用"yield"操作符(我不讨厌它:))。如果可能的话,我更喜欢使用LINQ。不管怎样,我在10分钟前找了一些帖子(你可以在下面找到链接),读了它,一些想法进入了我的大脑:)
rewrite-this-foreach-yield-to-a-linq-yield
想法:可能,我不使用"yield"不是很好。可能,它比LINQ有更好的性能或其他一些优势。
因此我有下一个问题,在上面的例子中(通常情况下),什么代码更"正确"(yield或LINQ) ?
注:当我们有可能使用LINQ而不是"yield"时,我对这种情况很感兴趣。
我个人认为在这种情况下使用LINQ 更清楚。它在一个比"调用这个方法,产生这个结果"更高的层次上运行——它描述了总体结果。
迭代器块对于实现 LINQ非常有用——无论是现有的操作符,还是添加自己的操作符。了解是值得的,但是我不会担心你不经常使用它们——这并不意味着代码不好或诸如此类的事情。
public static IEnumerable<Color> GetThemColors(){
GetThePrimaryIds().Select(id=>yield return GetColorById(id));
GetTheOtherIds().Select(id=>yield return GetOtherColorsById(id));
}
这段代码不起作用。
暂时忽略其他查询提供程序处理Linq的方式(例如对数据库),在您链接到的示例中,我们有两种不同的方法:
- 首先产生第一个枚举的所有内容,然后产生第二个枚举的所有内容。
- 调用
Enumerable.Concat
方法
那么,Enumerable.Concat
是什么?因为我们忽略了像Linq2SQL这样的情况(这可能会把concat变成UNION ALL
),我们在这里关心的是Linq2Objects的实现。
现在,有不止一种方法来覆盖concat,但是Mono源(例如)最终调用check,然后进入:
static IEnumerable<TSource> CreateConcatIterator<TSource> (IEnumerable<TSource> first, IEnumerable<TSource> second)
{
foreach (TSource element in first)
yield return element;
foreach (TSource element in second)
yield return element;
}
换句话说,LINQ方法是 yield
方法。
如果不是,它可能是非常相似的东西。我们可以(如果我们更喜欢打字的话)把它作为IEnumerator<TSource>
的实现来实现,但是yield
省去了我们的麻烦。
总之,LINQ是一堆方便的工具,可以很好地协同工作。当它们是有效的工具时,就使用它们。当另一个工具工作得更好时,使用它。当一个类似Linq的工具会很好,但它没有包含在你所拥有的工具中时,你可以自己编写它(就像我们可以在Linq之前完成所有Linq2Objects的东西,这在。net 2.0中没有)。