收益回报与回报选择
Posted
技术标签:
【中文标题】收益回报与回报选择【英文标题】:yield return versus return select 【发布时间】:2010-12-01 13:04:35 【问题描述】:这两种方法的优点/缺点是什么?
return items.Select(item => DoSomething(item));
对
foreach(var item in items)
yield return DoSomething(item);
编辑因为它们与 MSIL 大致相当,你觉得哪一个更具可读性?
【问题讨论】:
您的第二个代码片段是Select 的实现。 (假设这是 LINQ to Objects。)这就是 Select 所做的一切——它运行一个 foreach 循环,在每个项目上运行委托,并产生结果。 是的。但是在输入第一个和第二个时仍然存在差异。第一个区别:LOC 的数量,第二个区别:可读性,第三个区别:当方法中存在 yield return 时,有一些限制(即:您不能在同一方法中将 return select 放在 yield return 之后)。 【参考方案1】:yield return
技术使 C# 编译器在“幕后”生成枚举器类,而Select
调用使用通过委托参数化的标准枚举器类。在实践中,除了在Select
的情况下,对于代理而言,这两者之间应该没有太大的区别。
对于它的价值,将 lambda 包裹在 DoSomething
周围也是毫无意义的;直接为它传递一个委托。
【讨论】:
在这种情况下,传递委托与传递 lambda 有何不同? 返回 items.Select(DoSomething); 啊,这样,没想到。【参考方案2】:Select 仅允许您为“items”集合中的每个项目返回一个对象。
使用额外的.Where(x => DoIReallyWantThis(x))
可以清除不需要的项目,但仍然只允许您为每个项目返回一个对象。
如果您希望每个项目可能有多个对象,则可以使用.SelectMany
,但很容易以一条难以阅读的长线结束。
如果您正在查看复杂的数据结构并在这里和那里挑选一些信息,“yield return”有可能使您的代码更具可读性。我见过的最好的例子是,大约有十几个不同的条件会导致返回对象,并且在每种情况下返回的对象都是不同的。
【讨论】:
【参考方案3】:在发展缓慢的企业世界中,我目前花费的时间比我希望的要多,收益回报具有巨大的优势,它不需要至少不会安装的全新 .NET 3.5 框架再过 2 年。
【讨论】:
很酷的答案。但 .NET Framework 3.5 即将更新 (4.0)。 ".NET Framework 3.5 即将更新" - 不是我工作的地方 :(以上是关于收益回报与回报选择的主要内容,如果未能解决你的问题,请参考以下文章