这两种方法的优点/缺点是什么?
return items.Select(item => DoSomething(item));
与
foreach(var item in items)
{
yield return DoSomething(item);
}
编辑因为它们与MSIL大致相同,哪一个更易读?
答案 0 :(得分:17)
yield return
技术使C#编译器“在幕后”生成枚举器类,而Select
调用使用参数化的标准枚举器类。在实践中,除了Select
案例中的额外调用框架之外,两者之间不应该有很大的区别。
对于它的价值,在DoSomething
附近包裹一个lambda也是毫无意义的;只是直接传递代表。
答案 1 :(得分:10)
在我目前花费的时间超过我希望的缓慢移动的企业世界中,yield return具有巨大的优势,它不需要至少不会安装的全新.NET 3.5 Framework再过2年。
答案 2 :(得分:4)
选择仅允许您为“items”集合中的每个项目返回一个对象。
使用额外的.Where(x => DoIReallyWantThis(x))
可以清除不需要的项目,但仍然只允许您为每个项目返回一个对象。
如果您希望每个项目可能有多个对象,则可以使用.SelectMany
,但很容易找到一条不易于阅读的长行。
“yield return”有可能使您的代码更具可读性。我所看到的最好的例子就是大约有十几个单独的条件导致返回的对象,并且在每种情况下返回的对象构造方式都不同。