我想计算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++;
最后一种方法也可以是exandend来计算几个条件而不必多次迭代循环。 (我已经找到了getting the count property only takes 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)
我的问题:
有没有这样的事情,我还没找到呢?
如果不是:实现此类功能的方法是什么?
编辑:
添加LINQ看起来就像修复了它。
答案 0 :(得分:8)
你的语法略有偏差。这是使用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));
答案 1 :(得分:3)
使用谓词的计数方法:请参阅Enumerable.Count Method (IEnumerable, Func)
请注意,此方法是extension method,只有在添加对System.Linq命名空间的引用时才能使用它。