IEnumerableまたはIListを使用することの区別は、実際には(表面上で)非常に簡単です。
両方のインターフェイスで定義されている契約を見てください。 IEnumerableを使うと、シーケンスを列挙することができます。言い換えれば、データにアクセスする唯一の方法は、通常はforeachループで列挙子を使用することです。だから、カウント機能のナイーブな実装は次のようなものになるだろう:
public static int Count(this IEnumerable<T> source) {
int count = 0;
foreach(var item in myEnumerable)
{
count++;
}
return count;
}
これはあなたの列挙内の項目数を計算するのに必要な時間は、アイテムの数と直線的に増加することを意味します。また、これは内部的に格納されていないため、カウントするたびにこのループを実行する必要があります。
IListはすでにCountプロパティを公開しています。これは契約の一部です。 Count()を実装するには、単にCountプロパティへの呼び出しをラップします。これは、アイテムの数に関係なく同じ時間がかかります。
これについて考える簡単な方法は、(特にLinqを使用して)IEnumerableを必要な項目の仕様と考えることです。データにアクセスしない限り、構築する時間はほとんどありません。列挙を開始すると(基本的にIEnumerable以外のものを返すもの)、コードが実行され、時間がかかることがあります。
あなたのコンテキストに関して、私が通常やりたいことは、コントローラ内でLinqの実行を保つことです。だから、私はクエリをビルドしてから、ToListまたはToArrayをビューに送ります。理由は非常に単純です。ビューのデータに単にアクセスする以外に何かをしなければならないとすれば、私は自分の見解ではあまりにも多くのことをしていることを意味します。私は今、私の意見を可能な限りきれいに保ちながら、その論理を私のコントローラーのアクションに移すことを余儀なくされています。
どのLINQプロバイダを使用していますか(つまり、どこからデータが届いていますか)リストのサイズはどれくらいですか? – Oded
しかし、この場合、 'result.ToList'はIEnumerableで動作します。 –
@ L.Bが言っているのは、あなたが見ている遅さが 'IEnumeralbe'を使っているからではないということです。 –
Oded