0

私がこれを持っているとしましょう:

IEnumerable<MyObject> StructsTemp;

StructsTemp に n 個のクエリを作成して、DB から入力するようにしました。後で、次のように呼び出して実行します.ToList()

IList<MyObject> StructsFinal = StructsTemp.ToList();
... some queries on StructsFinal ....
StructsTemp = StructsFinal;

後で私がこれを行うとどうなりますか?

StructsTemp.Count()

StructsTemp で n 個のクエリを再実行しますか? これは StructsTemp.ToList() を再実行しますか? これにより、StructsFinal ですべてのクエリが再実行されますか?

4

2 に答える 2

1

List<T>変数にの参照を割り当てるとStructsTempIEnumerable<T> actuallyであり、基になるシーケンスを列挙する代わりにそのプロパティList<T>を使用します。Count

var numbers = new []{ 1,2,3 };
IEnumerable<int>evenNumbers = numbers.Where(i=> i % 2 == 0);
// deferred, will enumerate the sequence to count the even numbers
int count = evenNumbers.Count();
evenNumbers = evenNumbers.ToList();
// not deferred, using the Count property of List<T>
count = evenNumbers.Count();

したがって、後者は新しいコレクションに保持されるため、常に同じ値を返します。基になるコレクションが変更された場合、前者は各反復で異なる結果を返すことができます (fenumbers.Remove(2)evenNumbers.Count0 になります)。

編集

これは、その動作のより意味のあるデモです: http://ideone.com/91Yrh

于 2012-07-20T11:13:51.580 に答える
0

ToList()StructsTempそれが何であれ、の評価を強制しますが、後続のLinqには影響しません。

... some queries on StructsFinal ....遅延評価される場合とされない場合があります。

拡張機能は遅延してCount()いないため、 の実行を強制します... some queries on StructsFinal ....

余談ですが、... some queries on StructsFinal ....implementsの結果がICollection<T>そうIList<T>である場合、Count()拡張機能はCount結果のプロパティにアクセスするだけです。

于 2012-07-20T11:17:00.740 に答える