我几乎不使用"yield“运算符(我并不讨厌它:)。如果可能的话,我更喜欢使用LINQ。总之,我在10分钟前看了一些帖子(你可以在下面找到链接),读了它,一些想法浮现在我的大脑中:)
rewrite-this-foreach-yield-to-a-linq-yield
想法:也许,我不使用"yield“是不太好的。也许,它比LINQ或其他一些优点有更好的性能。
因此,我有了下一个问题,在上面的例子中(在常见情况下),哪个代码更“正确”(yield或LINQ)?
附注:当我们有可能使用LINQ而不是"yield“的情况下,我很感兴趣。
发布于 2011-10-24 21:44:47
我个人认为在这种情况下使用LINQ会更清楚。它在比“调用此方法,产生此结果”更高的级别上运行-它描述了总体结果。
迭代器块对于实现LINQ非常有用-无论是现有的运算符,还是添加您自己的运算符。了解它们是值得的,但我不会担心你不经常使用它们的事实-这并不是糟糕的代码或任何类似的迹象。
发布于 2011-10-24 22:45:52
public static IEnumerable<Color> GetThemColors(){
GetThePrimaryIds().Select(id=>yield return GetColorById(id));
GetTheOtherIds().Select(id=>yield return GetOtherColorsById(id));
} 此代码不起作用。Select是惰性的,并且这些集合不会被枚举。
发布于 2011-10-24 23:31:04
暂时忽略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东西一样,这在.NET2.0中是不存在的)。
https://stackoverflow.com/questions/7876516
复制相似问题