30

コレクション内のすべてのアイテムを列挙せずに、IEnumerable コレクション内のアイテムの数を取得するための最良/最も簡単な方法は何ですか?

LINQ または Lambda で可能ですか?

4

11 に答える 11

19

いずれにせよ、それをループする必要があります。Linq は次のCount方法を提供します。

var result = myenum.Count();
于 2008-08-26T18:12:17.420 に答える
17

解決策は、コレクションを列挙したくない理由によって異なります。

コレクションの列挙が遅いことが原因である場合、より高速な解決策はありません。可能であれば、代わりに 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 よりもスコープが広い) を使用するように変更することを検討してください。

于 2008-08-26T19:29:11.073 に答える
14

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

于 2008-08-26T18:12:23.893 に答える
5

これを使って。

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

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

カウントを返します。

于 2013-01-03T13:19:15.590 に答える
1

また、カウントによって何を達成したいかによっても異なります。列挙可能なコレクションに要素があるかどうかを知りたい場合は、次を使用できます

前者は最初の要素を生成し、後者はすべての要素を生成します。

于 2011-07-19T05:52:28.083 に答える
1

IList や ICollection もあります。ある程度柔軟でありながら、必要な機能を備えたコンストラクトを使用したい場合です。どちらも IEnumerable を意味します。

于 2008-08-26T18:15:15.243 に答える
0

最善の解決策 - 私が思うに、次のことを行うことです:

  1. System.Linq.Dynamic の使用;
  2. myEnumerable.AsQueryable().Count()
于 2010-12-20T16:42:57.537 に答える
0

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

count を使用してメンバーをチェックしている場合はAny()、コレクション全体の列挙を避けるために使用できます。

于 2008-08-28T12:49:57.147 に答える
0

.Count(...) を呼び出すとコレクションが列挙されるため、LINQ では不可能です。コレクションを 2 回反復処理できないという問題が発生している場合は、次のことを試してください。

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

foreach (MyTableItem in myList)
{
   ...
}
于 2008-08-26T18:12:21.617 に答える
0

Count プロパティを使用する場合は、IEnumerable および ICollection インターフェイスを実装する ILIST を使用します。ILIST データ構造は配列です。VS Debugger を使ってみたところ、以下の .Count プロパティが Array.Length プロパティを返すことがわかりました。

IList<string> FileServerVideos = Directory.GetFiles(VIDEOSERVERPATH, "*.mp4"); 
if (FileServerVideos.Count == 0)
    return;
于 2020-12-03T20:05:31.597 に答える