我使用了List.Select(condition).Count()
,发现结果不合适,然后我尝试了List.FindAll(condition).Count()
,它的效果很好。
List.Select(condition).count
是如何工作的?
list.Select(condition)
将列表转换为一系列长度始终等于列表项数的True
和False
值序列。如果使用Where
而不是Select
,则会得到匹配结果。
然而,更简洁的方法是将条件传递给Count
,如下所示:
var res = list.Count(condition);
List.Select
调用序列中每个元素的转换函数,并返回转换后的集合。通常情况下,使用此方法将返回与原始集合相同的Count
。
List.FindAll
接受一个谓词(类似于 List.Where
),因此只会返回与之匹配的元素,从而得到与原始集合不同的计数。
您的代码或过滤列表的方法根本是错误的。您试图做的是:
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
这行:
List.select(mylist => mylist.key == "somevalue")
List.select(mylist => mylist.key == "somevalue").count()
等同于
List.count();
而且
List.where(mylist => mylist.key == "somevalue").count()
按照您的意愿运作。
List.Select
中指定条件?你需要使用List.Where
。 - Habib