【问题标题】:What's the difference between FindAll and Select?FindAll 和 Select 有什么区别?
【发布时间】:2014-07-05 09:12:44
【问题描述】:

我使用了List.Select(condition).Count(),发现结果不合适,然后我尝试了List.FindAll(condition).Count(),效果很好。

List.Select(condition).count 是如何工作的?

【问题讨论】:

  • List.Select中的条件是怎么指定的,需要List.Where
  • List.select(mylist => mylist.key == "somevalue").count()
  • @DotnayTupperson 在发布之前您是否尝试过您的代码?
  • @Bedford - 这根本不是同一个问题。
  • 看来你误解了Select 的作用......

标签: c# .net linq


【解决方案1】:

这一行:

List.select(mylist => mylist.key == "somevalue")

创建值“true”和“false”的列表,但不过滤输出。因此计数与没有选择时相同。

List.select(mylist => mylist.key == "somevalue").count() 

相同
List.count();

List.where(mylist => mylist.key == "somevalue").count()

按照您想要的方式工作。

【讨论】:

    【解决方案2】:

    您过滤列表的代码或方法根本上是错误的。您正在尝试做的是:

     list.Select(mylist => mylist.key == "somevalue").Count();
    

    这将返回与列表长度相同的计数。对于每个项目,生成的集合将为真/假。

    你需要Enumerable.Where 喜欢:

     list.Select(mylist => mylist.key == "somevalue").Count();
    

    这将为您提供与 FindAll 方法中相同的计数。

    您甚至可以将谓词传递给 Count like:

    var count = list.Count(mylist => mylist.Key == "somevalue");
    

    FindAllEnumerable.Where 的不同之处在于FindAll 构造一个新列表,而Enumerable.Where 返回一个IEnumerable<T>。您可以阅读此问题以获取更多信息:C# FindAll VS Where Speed

    【讨论】:

      【解决方案3】:

      List.Select 对序列中的每个元素调用转换函数并返回转换后的集合。一般来说,使用它会返回与原始集合相同的Count

      List.FindAll 接受一个谓词(类似于List.Where),因此只会返回与其匹配的元素,给出与原始元素不同的计数。

      【讨论】:

        【解决方案4】:

        使用Select 执行映射 操作,而不是过滤操作。这意味着您将始终从查询中获得与原始列表中相同数量的项目。在您的情况下,您将列表从 List<T> 投影到 IEnumerable<bool>(带有原始的真假响应数)。

        使用.Where 过滤列表。

        【讨论】:

          【解决方案5】:

          您会看到不同的结果,因为

          list.Select(condition)
          

          将列表转换为TrueFalse 值的序列,其长度始终等于list 中的项目数。如果您使用Where 而不是Select,您将获得匹配的结果。

          但是,获得结果的更短的方法是将条件传递给Count,如下所示:

          var res = list.Count(condition);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-01
            • 2011-07-22
            • 1970-01-01
            • 1970-01-01
            • 2010-10-26
            • 2016-12-13
            相关资源
            最近更新 更多