收益回报与回报选择

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 即将更新" - 不是我工作的地方 :(

以上是关于收益回报与回报选择的主要内容,如果未能解决你的问题,请参考以下文章

正确使用“收益回报”

Java中的收益回报

2021年当前市场S19系列挖矿投资收益分析(年回报率超90%))

用ML算法预测股票收益率

质押挖矿?看看CRUST的回报率!

挖矿的收益到底怎样,年回报率能达到500%​?