2008-08-26 20 views
26

IEnumerableコレクション内のアイテムの数を取得するベスト/最も簡単な方法は、コレクション内のすべてのアイテムを列挙せずにですか?IEnumerableのカウントを取得する最善の方法<T>

LINQまたはLambdaで使用できますか?

+1

[Howto:反復せずにIEnumerable からアイテムを数えますか?](http://stackoverflow.com/questions/168901/howto-count-the-items-from-a-ienumerablet-without-iterating ) –

答えて

12

あなたがカウントを取得するために列挙する必要があります。リストのような他の構造体は、実行カウントを保持します。

+0

IEnumerable変数がメソッドに渡された場合は、variable.Count()が機能しました。 –

+0

@Vikram私が知る限り、それは当てはまりません。あなたはどこかにキャストしていないと確信していますか? – Sinjai

13

いずれにしても、ループする必要があります。コレクションを列挙ん.Count(...)を呼び出すと、LINQと

var result = myenum.Count(); 
+1

これはうまくいきますが、 "using System.Linq;"ファイルの先頭に。 Linqなしでは、これは動作しません。 – user1961169

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()を呼び出すこともできます。これは、カウントの前にあった場所から続行されます。例えば:

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(); 

上記のすべては、あなたがタイプ(即ち、それはあなたが所有していないライブラリから返される)を変更することはできませんと仮定します。可能であれば、Countプロパティを持つICollectionまたはIList(ICollectionはIListよりも広くスコープされています)を使用するように変更することを検討してください。

0

カウントしてループする必要がある場合は、リストを使用する方がよい場合があります。

カウントを使用してメンバーを確認する場合は、Any()を使用してコレクション全体を列挙しないようにすることができます。

0

私は思う-as最善の解決策は、次の操作を行うことです。

  1. System.Linq.Dynamicを使用して、
  2. myEnumerable.AsQueryable()。(カウント)
+4

間違っています。それは他の何ものよりもうまくいかず、おそらく悪化するでしょう。 – SLaks

1

また、あなたが計数により達成したいものに依存..あなたが列挙コレクションは任意の要素を持っている場合に見つけることが興味を持っている場合は、

を使用することができます

myEnumerable.Any()はmyEnumerable.Count()で、前者は最初の要素を生成し、後者はすべての要素を生成します。

5

これを使用してください。

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

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

カウントを返します。

+3

list.OfType ().Count() – Mukesh

1

IEnumerableはすべての項目を反復処理する必要があります。完全なカウントを取得します。 IEnumerableに1つ以上の項目があるかどうかを確認する必要がある場合は、より効率的な方法は、あるものがあるかどうかを確認することです。 Any()は値があり、すべてをループしていないことを確認するだけです。

IEnumerable myStrings = new List(){"one"、 "two"、 "three"};

bool hasValues = myStrings.Any();

関連する問題