FindAll和Select有什么区别?

3

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

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


1
你如何在 List.Select 中指定条件?你需要使用 List.Where - Habib
List.select(mylist => mylist.key == "somevalue").count() 列表.选择(我的列表 => 我的列表.键 == "某个值").计数() - Dotnay Tupperson
1
@DotnayTupperson 在发布代码之前,你有试过它吗? - Hamlet Hakobyan
1
@Bedford - 这完全不是同一个问题。 - Lee
“Select” 的意思是“从每个项目中选择一个值(派生)”,它是对单个值进行转换操作,而不是“从序列中选择特定的项目”。与 FindAll 相对应的 LINQ 操作是“Where”。 - user2864740
显示剩余2条评论
5个回答

6
你看到不同的结果是因为:
list.Select(condition)

将列表转换为一系列长度始终等于列表项数的TrueFalse值序列。如果使用Where而不是Select,则会得到匹配结果。

然而,更简洁的方法是将条件传递给Count,如下所示:

var res = list.Count(condition);

3

List.Select 调用序列中每个元素的转换函数,并返回转换后的集合。通常情况下,使用此方法将返回与原始集合相同的Count

List.FindAll 接受一个谓词(类似于 List.Where),因此只会返回与之匹配的元素,从而得到与原始集合不同的计数。


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


1
使用

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

按照您的意愿运作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接