コレクション内のすべてのアイテムを列挙せずに、IEnumerable コレクション内のアイテムの数を取得するための最良/最も簡単な方法は何ですか?
LINQ または Lambda で可能ですか?
いずれにせよ、それをループする必要があります。Linq は次のCount
方法を提供します。
var result = myenum.Count();
解決策は、コレクションを列挙したくない理由によって異なります。
コレクションの列挙が遅いことが原因である場合、より高速な解決策はありません。可能であれば、代わりに 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)
列挙に副作用 (ディスク/コンソールへの書き込みなど) があるか、カウントと列挙の間で変化する可能性のある変数 (ディスクからの読み取りなど) に依存している場合 [NB 可能であれば、アーキテクチャを再考することをお勧めします。多くの問題がある] では、考慮すべき 1 つの可能性は、列挙型を断続的なストレージに読み込むことです。例えば:
List<int> seriesAsList = Series.Generate(5).ToList();
上記はすべて、タイプを変更できないことを前提としています (つまり、所有していないライブラリから返されたものです)。可能であれば、Count プロパティを持つ ICollection または IList (ICollection は IList よりもスコープが広い) を使用するように変更することを検討してください。
カウントを取得するには、列挙する必要があります。List のような他の構造は、実行中のカウントを保持します。
これを使って。
IEnumerable list =..........;
list.OfType<T>().Count()
カウントを返します。
また、カウントによって何を達成したいかによっても異なります。列挙可能なコレクションに要素があるかどうかを知りたい場合は、次を使用できます
前者は最初の要素を生成し、後者はすべての要素を生成します。
IList や ICollection もあります。ある程度柔軟でありながら、必要な機能を備えたコンストラクトを使用したい場合です。どちらも IEnumerable を意味します。
最善の解決策 - 私が思うに、次のことを行うことです:
カウントしてからループする必要がある場合は、リストを使用したほうがよい場合があります。
count を使用してメンバーをチェックしている場合はAny()
、コレクション全体の列挙を避けるために使用できます。
.Count(...) を呼び出すとコレクションが列挙されるため、LINQ では不可能です。コレクションを 2 回反復処理できないという問題が発生している場合は、次のことを試してください。
List<MyTableItem> myList = dataContext.MyTable.ToList();
int myTableCount = myList.Count;
foreach (MyTableItem in myList)
{
...
}
Count プロパティを使用する場合は、IEnumerable および ICollection インターフェイスを実装する ILIST を使用します。ILIST データ構造は配列です。VS Debugger を使ってみたところ、以下の .Count プロパティが Array.Length プロパティを返すことがわかりました。
IList<string> FileServerVideos = Directory.GetFiles(VIDEOSERVERPATH, "*.mp4");
if (FileServerVideos.Count == 0)
return;