首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ与yield

LINQ与yield
EN

Stack Overflow用户
提问于 2011-10-24 21:40:44
回答 3查看 3.9K关注 0票数 4

我几乎不使用"yield“运算符(我并不讨厌它:)。如果可能的话,我更喜欢使用LINQ。总之,我在10分钟前看了一些帖子(你可以在下面找到链接),读了它,一些想法浮现在我的大脑中:)

rewrite-this-foreach-yield-to-a-linq-yield

想法:也许,我不使用"yield“是不太好的。也许,它比LINQ或其他一些优点有更好的性能。

因此,我有了下一个问题,在上面的例子中(在常见情况下),哪个代码更“正确”(yield或LINQ)?

附注:当我们有可能使用LINQ而不是"yield“的情况下,我很感兴趣。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-24 21:44:47

我个人认为在这种情况下使用LINQ会更清楚。它在比“调用此方法,产生此结果”更高的级别上运行-它描述了总体结果。

迭代器块对于实现LINQ非常有用-无论是现有的运算符,还是添加您自己的运算符。了解它们是值得的,但我不会担心你不经常使用它们的事实-这并不是糟糕的代码或任何类似的迹象。

票数 8
EN

Stack Overflow用户

发布于 2011-10-24 22:45:52

代码语言:javascript
复制
public static IEnumerable<Color> GetThemColors(){
     GetThePrimaryIds().Select(id=>yield return GetColorById(id));
     GetTheOtherIds().Select(id=>yield return GetOtherColorsById(id));
} 

此代码不起作用。Select是惰性的,并且这些集合不会被枚举。

票数 2
EN

Stack Overflow用户

发布于 2011-10-24 23:31:04

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

  1. 首先从第一个枚举中生成所有内容,然后从第二个枚举中生成所有内容。
  2. 调用Enumerable.Concat方法。

那么Enumerable.Concat是什么呢?因为我们忽略了像Linq2SQL这样的情况(这很可能会把concat变成一个UNION ALL),所以我们在这里关心的是Linq2Objects实现。

现在,有不止一种方法可以给concat换皮,但是Mono源代码(例如)最终调用了一个check,然后进入:

代码语言:javascript
复制
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东西一样,这在.NET2.0中是不存在的)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7876516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档