为什么这个MSDN示例用于Func<>委托有一个多余的Select()调用?

时间:2010-04-25 15:04:42

标签: c# delegates msdn

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,并且代码打印相同的东西。

我错过了什么,或者是误导性的例子?

4 个答案:

答案 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)

确实,不需要,msdn page底部有一个反馈按钮。告诉他们。不需要选择。仅仅是Select子句的事实是:

Select(str => str)

它接收字符串并输出相同的字符串

答案 3 :(得分:0)

你有一个非常奇怪的链接。本主题不在TOC中,顶部有以下内容:

“[本主题为预发布文档,在将来的版本中可能会有所更改。空白主题包含在占位符中。]”

第一行看起来像是作家对自己的评论。

自从VS 2010和.NET 4.0刚刚发布以来,我想,这是一个尚未及时删除/替换的某种破碎主题。

我认为,此内容的正确网址为:http://msdn.microsoft.com/en-us/library/bb534303.aspx

顺便问一下,你是如何得到你的网址的?是通过MSDN搜索还是别的什么?