2008-08-26 25 views
26

什麼是最好的/最簡單的方法來獲取IEnumerable集合中的項目數而不枚舉集合中的所有項目?獲得IEnumerable數的最佳方法<T>

可能與LINQ或Lambda?

+1

可能的重複[Howto:從IEnumerable計數項目沒有迭代?](http://stackoverflow.com/questions/168901/howto-count-the-items-from-a-ienumerablet-without-iterating ) – 2012-02-18 15:22:06

回答

12

您必須枚舉以獲得計數。像List這樣的其他結構保持運行計數。

+0

如果將IEnumerable變量傳遞給該方法,則variable.Count()對我有用。 – 2015-07-13 15:46:11

+0

@Vikram據我所知,這不可能是真的。你確定你不是在某個地方演出? – Sinjai 2017-07-20 15:16:33

13

無論如何,你必須循環遍歷它。 LINQ提供Count方法:

var result = myenum.Count(); 
+1

是的,這工作,只要你有「使用System.Linq;」在文件的開頭。沒有Linq,這是行不通的。 – user1961169 2013-11-21 02:16:12

0

不使用LINQ可能的,因爲調用.Count之間(...)不枚舉集合。如果遇到無法遍歷集合兩次的問題,請嘗試以下操作:

List<MyTableItem> myList = dataContext.MyTable.ToList(); 
int myTableCount = myList.Count; 

foreach (MyTableItem in myList) 
{ 
    ... 
} 
1

還有IList或ICollection,如果你想使用一個仍然有點靈活的構造,但也有你需要的功能。它們都暗示IEnumerable。

16

解決方案取決於您不想枚舉集合的原因。

如果這是因爲枚舉集合可能很慢,那麼沒有解決方案會更快。如果可能,您可能需要考慮使用ICollection。除非枚舉速度非常慢(例如從磁盤讀取項目),否則速度不應該成爲問題。

如果這是因爲枚舉集合需要更多的代碼,那麼它已經以.Count()擴展方法的形式爲您編寫。只需使用MyEnumerable.Count()。

如果這是因爲您希望能夠在計數後枚舉集合,那麼.Count()擴展方法允許這樣做。你甚至可以在你正在枚舉的集合上調用.Count(),它會繼續從count之前的位置繼續。例如:

foreach (int item in Series.Generate(5)) 
{ 
    Console.WriteLine(item + "(" + myEnumerable.Count() + ")"); 
} 

會給結果

0(5)

1(5)

2(5)

3(5)

4(5)

如果是因爲枚舉有副作用(例如,寫入磁盤/控制檯)或依賴於可能在計數和枚舉之間改變的變量(例如,從磁盤讀取)[N.B.如果可能的話,我會建議重新考慮這個架構,因爲這可能會導致很多問題],那麼需要考慮的一種可能性是將枚舉讀取爲間歇存儲。例如:

List<int> seriesAsList = Series.Generate(5).ToList(); 

以上所有假設您不能更改類型(即從不擁有的庫中返回)。如果可能的話,您可能需要考慮更改爲使用ICollection或IList(ICollection的範圍比IList的範圍更廣),它具有Count屬性。

0

如果你需要計數,然後循環,你可能會更好的列表。

如果您使用的計數來檢查成員可以使用Any()避免枚舉整個集合。

0

- 作爲最好的解決辦法,我認爲是要做到以下幾點:使用System.Linq.Dynamic

  1. ;
  2. myEnumerable.AsQueryable()。COUNT()
+4

錯誤。這不比別的更好,可能更糟。 – SLaks 2011-01-06 22:24:14

1

這也取決於你想通過計算達到的目標。如果你有興趣,查明枚舉集合有任何元素,你可以使用

myEnumerable.Any()over myEnumerable.Count()其中前者將產生第一個元素,後者將產生所有元素。

5

使用此。

IEnumerable list =..........; 

list.OfType<T>().Count() 

它將返回計數。

1

一個IEnumerable將不得不通過每個項目進行迭代。得到全數。 如果您只需檢查IEnumerable中是否有一個或多個項目,則更有效的方法是檢查是否有任何項目。 Any()只檢查是否有值,並且不會遍歷所有內容。

IEnumerable的myStrings =新列表(){ 「一」, 「二」, 「三」};

布爾hasValues = myStrings.Any();

相關問題