2014-07-08 65 views
0

我想計算匹配某個條件的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; 

然而,其分配和初始化一個新的列表等只得到計數。

的一種方式與分配開銷較低等:

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)

我的問題(S):
有沒有這樣的事情,只是我還沒有找到它?
如果不是:實現此功能的方式是什麼?

編輯:
添加LINQ看起來像它修復它。

+1

哪個版本的c#?有[Enumerable.Count 方法(IEnumerable ,Func )](http://msdn.microsoft.com/fr-fr/library/bb535181(v = vs.110).aspx) – NicoD

+1

有看一下LINQ方法Count:http://msdn.microsoft.com/en-us/library/vstudio/system.linq.enumerable.count(v=vs.100).aspx –

+1

可能重複的http:// stackoverflow.com/questions/3853010/get-item-count-of-a-list-using-linq –

回答

7

你的語法稍微偏離了一點。這是如何使用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)); 
相關問題