对List-collection中满足一定条件的对象进行计数
本文关键字:对象 条件 List-collection 满足 | 更新日期: 2023-09-27 18:11:52
我想计算List<T>
中符合特定条件的对象的出现次数。
例如:int List<T>.Count(Predicate<T> match)
例如,如果我有一个chores
的清单,我可以看到有多少是过期的。
int overdue = listOfChores.Count((element) => { return element.DueDate <= DateTime.Today; });
我知道这是不存在的,到目前为止,我用下面的方法解决这样的问题:
int overdue = listOfChores.FindAll([...]).Count;
然而,分配和初始化一个新的List等只是为了获得计数。
一种使用更少的分配开销等的方法:
int good = 0;
foreach(chore element in listOfChores)
if(element.DueDate <= DateTime.Today)
good++;
最后一种方法还可以扩展为计算多个条件,而无需在循环中迭代多次。(我已经发现获得计数属性只需要O(1),但从列表中计数仍然需要花费大量时间)
int a = 0;
int b = 0;
foreach(chore element in listOfChores)
if(element.CondA)
a++;
if(element.CondB)
b++;
考虑到这一点,我甚至可以想象出像
这样的东西int[] List<T>.Count(Predicate<T>[] matches)
我的问题(s):
有没有这种东西,只是我还没找到而已?
如果没有:实现这些功能的方法是什么?
添加LINQ似乎可以修复它。
你只是语法有点问题。这是如何使用Count
:
int overdue = listOfChores.Count(element => element.DueDate <= DateTime.Today);
如果你已经有了一个Predicate<T>
,并想把它传递给Count
,只需像调用函数一样调用它:
Predicate<Chore> p = (element) => element.DueDate <= DateTime.Today;
int overdue = listOfChores.Count(element => p(element));
有一个使用谓词的计数方法:参见Enumerable。Count Method (IEnumerable, Func)
注意这个方法是一个扩展方法,只有当你向System添加一个引用时才能使用它。Linq命名空间。