【问题标题】:Why is the LINQ "apply-to-all" method named Select?为什么将 LINQ“应用到所有”方法命名为 Select?
【发布时间】:2013-03-30 17:10:58
【问题描述】:

当我阅读使用Select 的代码时,我认为是“全选”。 当我阅读使用Map 的代码时,我认为“this-to-that”或“apply-to-all”。 我不可能是唯一一个觉得Select 这个名字很混乱的人。

Map

【问题讨论】:

    标签: linq naming-conventions


    【解决方案1】:

    这与函数式语言中的 map 完全相同。它被命名为Select 的原因是它被设计为用作LINQ 的一部分,它使用类似SQL 的关键字。

    from item in collection
    where item.Value == someValue
    select item.Name
    

    翻译成:

    collection.Where(item => item.Value == someValue)
              .Select(item => item.Name)
    

    如果Select 被命名为Map 会有点不一致;类似:

    collection.Filter(item => item.Value == someValue)
              .Map(item => item.Name)
    

    事实上,很多人在使用 LINQ 时根本没有听说过函数式编程。对他们来说,LINQ 是一种检索数据对象并轻松查询它们的方法(就像 SQL 查询一样)。对他们来说,Select 和 Where 非常有意义。远远超过Map 和Filter。

    【讨论】:

    • 完全有道理。如果我真的很在意,我可以将 Where 和 Select 包装在扩展方法中。
    • 好答案。我实际上使用了没有 LINQ 的“Select”,但它作为 LINQ 表达式更清晰。
    • 谢谢,很好的回答。断章取义没有任何意义,但这有助于解释它。
    • 这是一个值得指出的小区别:在 LINQ 中,映射(“选择”)的应用是延迟的。例如,如果你这样做:collection.Select( x => x*x )collection[0] // x*x not applied. 为了强制评估,你可以强制创建一个新列表:collection = collection.Select( x => x*x ).ToList()
    【解决方案2】:

    起初Select 对我来说似乎也没有什么困惑,但这只是时间问题。 Mehrdad 告诉您Select 的充分理由。除此之外,我觉得Select 更好地传达了Linq 的不变性方面。并不是说Map 意味着它正在改变原始结构,而是Select 说得更清楚。它告诉您没有触及原始列表,而只是从中选择以形成另一个列表。

    它与其他命名以及Where 一样。当您致电collection.Filter 时,它会让您知道您正在过滤该特定集合,或者至少是第一次。最后,一切都是熟悉的问题。虽然一开始我对Linq 的命名很恼火,但现在我觉得 MS 团队的做法最正确。

    【讨论】:

    • +1 for "Select 说明它更清晰"。必须在 SQL 语法之外思考。
    【解决方案3】:

    Select 排在最后的主要原因之一是让 Intellisense 工作。通过将序列的来源放在首位(from 语句),Intellisense 可以正常工作。

    【讨论】:

    • 这与问题有什么关系?
    猜你喜欢
    • 2020-02-28
    • 2018-01-08
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2013-05-19
    • 1970-01-01
    相关资源
    最近更新 更多