代码之家  ›  专栏  ›  技术社区  ›  TarkaDaal

为什么这个func<>委托的msdn示例有多余的select()调用?

  •  5
  • TarkaDaal  · 技术社区  · 15 年前

    在有关 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 回复  |  直到 15 年前
        1
  •  9
  •   Aaronaught    15 年前

    这个 Select 确实是多余的。

    我怀疑这个例子可能是从查询理解语法“翻译”来的,如:

    IEnumerable<String> aWords = 
        from w in words
        where (...)
        select w;
    

    使用此语法时,您 select 最后,这就是编译器的工作原理。当使用 Where 但是,扩展方法是完全不必要的,除非您实际上需要进行单独的投影。

    或者,可能只是一个错误。MSDN的作者们并非一无是处!

        2
  •  1
  •   Lee    15 年前

    不,不需要。

    如果您希望强制对序列进行惰性评估(即防止强制转换),则可以使用这种构造。如果有一个方法返回 List<T> 但宣布 IEnumerable<T> 然后客户端可以强制转换返回类型并直接操作基础列表。显然,这是一个非常糟糕的主意,但是类可以通过应用一个标识选择来保护其状态,例如本例中使用的标识选择:

    public IEnumerable<T> Items
    {
       get { return privateList.Select(i => i); }
    }
    
        3
  •  0
  •   Michael Buen    15 年前

    实际上,不需要,底部有一个反馈按钮 msdn page . 告诉他们。不需要选择。select子句只是一个事实:

    Select(str => str)
    

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

        4
  •  0
  •   Alexandra Rusina    15 年前

    你在那里有一个非常奇怪的联系。此主题不在TOC中,顶部有以下内容:

    “[本主题是预发布文档,未来版本可能会有所更改。空白主题作为占位符包含在内。]

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

    我猜,自从2010年和.NET 4.0发布以来,这是一个没有及时删除/替换的坏话题。

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

    顺便问一下,你是怎么得到网址的?是通过msdn搜索还是其他什么方式?