MSDN在Func Generic Delegate:
的文章中提供了此代码示例Func<String, int, bool> predicate = ( str, index) => str.Length == index;
String[] words = { "orange", "apple", "Article", "elephant", "star", "and" };
IEnumerable<String> aWords = words.Where(predicate).Select(str => str);
foreach (String word in aWords)
Console.WriteLine(word);
我明白这一切是做什么的。
是我不明白的Select(str => str)
位。当然不需要吗?如果你把它拿出来只是
IEnumerable<String> aWords = words.Where(predicate);
然后你仍然得到一个包含相同结果的IEnumerable,并且代码打印相同的东西。
我错过了什么,或者是误导性的例子?
答案 0 :(得分:9)
Select
确实是多余的。
我怀疑此示例可能已从查询理解语法中“翻译”,如:
IEnumerable<String> aWords =
from w in words
where (...)
select w;
使用这种语法时,最后有到select
,这就是编译器的工作原理。但是,使用Where
扩展方法时,除非您确实需要进行单独投影,否则完全没有必要。
或者,也许这只是一个错误。 MSDN编写者并非绝对可靠!
答案 1 :(得分:1)
不,不需要它。
如果您想强制对序列进行延迟评估,即防止投射,可以使用这样的构造。如果您的方法返回List<T>
但声明了IEnumerable<T>
返回类型,则客户端可以转换返回类型并直接操作基础列表。显然这是一个非常糟糕的主意,但是一个类可以通过应用身份选择来保护其状态,例如本例中使用的身份选择:
public IEnumerable<T> Items
{
get { return privateList.Select(i => i); }
}
答案 2 :(得分:0)
答案 3 :(得分:0)
你有一个非常奇怪的链接。本主题不在TOC中,顶部有以下内容:
“[本主题为预发布文档,在将来的版本中可能会有所更改。空白主题包含在占位符中。]”
第一行看起来像是作家对自己的评论。
自从VS 2010和.NET 4.0刚刚发布以来,我想,这是一个尚未及时删除/替换的某种破碎主题。
我认为,此内容的正确网址为:http://msdn.microsoft.com/en-us/library/bb534303.aspx
顺便问一下,你是如何得到你的网址的?是通过MSDN搜索还是别的什么?