【发布时间】:2013-03-30 17:10:58
【问题描述】:
当我阅读使用Select 的代码时,我认为是“全选”。
当我阅读使用Map 的代码时,我认为“this-to-that”或“apply-to-all”。
我不可能是唯一一个觉得Select 这个名字很混乱的人。
【问题讨论】:
当我阅读使用Select 的代码时,我认为是“全选”。
当我阅读使用Map 的代码时,我认为“this-to-that”或“apply-to-all”。
我不可能是唯一一个觉得Select 这个名字很混乱的人。
【问题讨论】:
这与函数式语言中的 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 包装在扩展方法中。
collection.Select( x => x*x )collection[0] // x*x not applied. 为了强制评估,你可以强制创建一个新列表:collection = collection.Select( x => x*x ).ToList()
起初Select 对我来说似乎也没有什么困惑,但这只是时间问题。 Mehrdad 告诉您Select 的充分理由。除此之外,我觉得Select 更好地传达了Linq 的不变性方面。并不是说Map 意味着它正在改变原始结构,而是Select 说得更清楚。它告诉您没有触及原始列表,而只是从中选择以形成另一个列表。
它与其他命名以及Where 一样。当您致电collection.Filter 时,它会让您知道您正在过滤该特定集合,或者至少是第一次。最后,一切都是熟悉的问题。虽然一开始我对Linq 的命名很恼火,但现在我觉得 MS 团队的做法最正确。
【讨论】:
Select 说明它更清晰"。必须在 SQL 语法之外思考。
Select 排在最后的主要原因之一是让 Intellisense 工作。通过将序列的来源放在首位(from 语句),Intellisense 可以正常工作。
【讨论】: