我使用List.Select(condition).Count()
并发现结果不合适,然后我尝试List.FindAll(condition).Count()
并且它运行正常。
List.Select(条件).count如何工作?
答案 0 :(得分:4)
您会看到不同的结果,因为
list.Select(condition)
将列表转换为True
和False
值的序列,其长度始终等于list
中的项目数。如果您使用Where
代替Select
,则会得到匹配的结果。
然而,获得结果的更简单方法是将条件传递给Count
,如下所示:
var res = list.Count(condition);
答案 1 :(得分:2)
List.Select
在序列中的每个元素上调用转换函数,并返回转换后的集合。通常,使用此选项将返回与原始集合相同的Count
。
List.FindAll
采用谓词(类似于List.Where
),因此只会返回与其匹配的元素,从而提供与原始元素不同的计数。
答案 2 :(得分:2)
您的代码或过滤列表的方法根本就是错误的。你要做的是:
list.Select(mylist => mylist.key == "somevalue").Count();
这将返回与List长度相同的计数。生成的集合对于每个项目都是真/假。
您需要Enumerable.Where
喜欢:
list.Select(mylist => mylist.key == "somevalue").Count();
这将为您提供与FindAll
方法中找到的计数相同的计数。
您甚至可以将谓词传递给Count,如:
var count = list.Count(mylist => mylist.Key == "somevalue");
FindAll
与Enumerable.Where
的不同之处在于FindAll
构建新列表,而Enumerable.Where
则返回IEnumerable<T>
。您可以阅读此问题以获取更多信息:C# FindAll VS Where Speed
答案 3 :(得分:1)
使用Select
执行映射操作,而不是过滤操作。这意味着您将始终从查询中获得与原始列表中相同数量的项目。在您的情况下,您将列表从List<T>
投影到IEnumerable<bool>
(使用原始的真或假响应数)。
使用.Where
过滤列表。
答案 4 :(得分:0)
这一行:
List.select(mylist => mylist.key == "somevalue")
创建值“true”和“false”的值列表,但不过滤输出。因此,计数与没有选择相同。
List.select(mylist => mylist.key == "somevalue").count()
与
相同List.count();
和
List.where(mylist => mylist.key == "somevalue").count()
以你想要的方式工作。