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 versus yield

我个人认为在这种情况下使用LINQ 更清楚。它在一个比"调用这个方法,产生这个结果"更高的层次上运行——它描述了总体结果。

迭代器块对于实现 LINQ非常有用——无论是现有的操作符,还是添加自己的操作符。了解是值得的,但是我不会担心你不经常使用它们——这并不意味着代码不好或诸如此类的事情。

public static IEnumerable<Color> GetThemColors(){
     GetThePrimaryIds().Select(id=>yield return GetColorById(id));
     GetTheOtherIds().Select(id=>yield return GetOtherColorsById(id));
} 

这段代码不起作用。

暂时忽略其他查询提供程序处理Linq的方式(例如对数据库),在您链接到的示例中,我们有两种不同的方法:

  1. 首先产生第一个枚举的所有内容,然后产生第二个枚举的所有内容。
  2. 调用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中没有)。