【问题标题】:is there anyway this LINQ could end up doing too much work?无论如何,这个 LINQ 最终会做太多的工作吗?
【发布时间】:2014-01-28 18:36:17
【问题描述】:

我有一个客户列表,我只想返回客户名称(加入名字和姓氏)。可以使用以下 Linq 轻松完成:

return customers.Select(a => string.Format("{0} {1}", a.Forename, a.Surname).First();

如果我理解正确,“选择”只会针对语句要求的行运行,这是正确的。所以对于上面的代码,而不是选择构建一个字符串列表并且只使用第一个(扔掉其他的),select语句只运行第一行(由.First()要求)然后终止,所以只有为一行构建字符串(返回的第一个)。对吗?

显然在 .Select() 和 .First 之间放置一个“.ToList()”会导致它构建一个字符串列表,然后只取第一个,但是上面的 Linq 有没有其他方法可以最终做太多的工作?这是我觉得我应该已经确定答案的事情,但最好确认一下。

【问题讨论】:

  • 选择返回一个IEnumerable,仅在需要时才进行惰性求值。

标签: c# linq


【解决方案1】:

[...] 所以只为一行构建字符串(返回的第一行)。对吗?

没错。

显然在 .Select() 和 .First 之间放置一个 ".ToList()" 会导致它构建一个字符串列表,然后只取第一个

再次更正。

上面的 Linq 有没有其他方法最终会做太多的工作?

没有。你所拥有的一切都很好。

我将First 放在一个新行上,这样就没有水平滚动,这样读者就会注意到它被调用了,因为它相当重要,但无需更改代码。

【讨论】:

    【解决方案2】:

    这是一个证明,你的代码可以做你想做的事。
    http://dotnetfiddle.net/IGE7bN
    当你使用'First'时,'select' 中的表达式只调用一次。

    【讨论】:

    • 在 sn-p 中,你可以看到,Console.WriteLine 只为 First 执行了一次。如果您查看OP的问题,OP只是询问证明,他理解所有正确。所以,一切都是正确的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多