私が書いた場合:
for (int i = 0; i < Strutture.Count(); i++)
{
}
Struttureは200要素のIEnumerableであり、IISがクラッシュします。これは、実行するたびにStrutture.Count()
、そのIEnumerableにリンクされているすべてのLINQクエリが実行されることを確認しているためです。
では、どうすれば「現在の」要素数を取得できますか?リストが必要ですか?
私が書いた場合:
for (int i = 0; i < Strutture.Count(); i++)
{
}
Struttureは200要素のIEnumerableであり、IISがクラッシュします。これは、実行するたびにStrutture.Count()
、そのIEnumerableにリンクされているすべてのLINQクエリが実行されることを確認しているためです。
では、どうすれば「現在の」要素数を取得できますか?リストが必要ですか?
数を具体化します。
int number = Strutture.Count();
for (int i = 0; i < number; i++)
{
}
またはリストを具体化します。
var list = Strutture.ToList();
for (int i = 0; i < list.Count; i++)
{
}
またはforeach
foreach(var item in Strutture)
{
}
「これは、Strutture.Count() を実行するたびに、その IEnumerable にリンクされたすべての LINQ クエリが実行されることがわかっているためです。」
そうしないと、どのようにして要素がいくつあるかを知ることができますか?
例えば:
Enumerable.Range(0,1000).Where(i => i % 2==0).Skip(100).Take(5).Count();
LINQ を実行せずに、要素の数をどうやって知ることができるでしょうか?
ソース (Enumerable.Range など) に含まれる要素の数を知りたい場合は、そのソースへの参照を使用して直接クエリを実行することをお勧めします。例えば
var numbers = Enumerable.Range(0,1000);
numbers.Count();
また、一部のデータ ソースには実際には「カウント」の概念がなく、存在する場合は、すべてのアイテムを調べてカウントする必要があることに注意してください。
最後に、 .Count() を繰り返し使用している場合 [そして値が実際に変更されるとは思わない] 場合は、キャッシュすることをお勧めします。
var count = numbers.Count();
for (int i =0; i<count; i++) // Do Something
補足:
「最初はCount()で、LINQクエリが実行されます。それよりも、次は値を「チェック」するだけです:)「LINQクエリを再度実行する...」ではありません:)」 - Markzzz
では、そうしませんか?
var query = Enumerable.Range(0,1000).Where(i => i % 2==0).Skip(100).Take(5).Count();
var result = query.ToArray() //Gets and stores the result!
result.Length;
:)
「しかし、最初の「カウント」を行うと、(LINQ クエリの後に) 新しい IEnumerable を格納する必要があります (状態が変更されます)。もう一度 .Count() を行うと、LINQ はすべてのクエリを再度実行する必要があります。」-マルクズズ
X、Y、Z にコンパイルされるクエリを作成しているためです。同じクエリを 2 回実行していますが、結果は異なる場合があります。
たとえば、これを確認してください。
static void Main(string[] args)
{
var dataSource = Enumerable.Range(0, 100).ToList();
var query = dataSource.Where(i => i % 2 == 0);
//Run the query once and return the count:
Console.WriteLine(query.Count()); //50
//Now lets modify the datasource - remembering this could be a table in a db etc.
dataSource.AddRange(Enumerable.Range(100, 100));
//Run the query again and return the count:
Console.WriteLine(query.Count()); //100
Console.ReadLine();
}
これが、上記のクエリの結果を保存することをお勧めする理由です!