FindAll和Select有什么区别?

时间:2014-05-16 19:40:21

标签: c# .net linq

我使用List.Select(condition).Count()并发现结果不合适,然后我尝试List.FindAll(condition).Count()并且它运行正常。

List.Select(条件).count如何工作?

5 个答案:

答案 0 :(得分:4)

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

list.Select(condition)

将列表转换为TrueFalse值的序列,其长度始终等于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");

FindAllEnumerable.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()

以你想要的方式工作。