Der Unterschied zwischen der Verwendung eines IEnumerable oder eines IList ist eigentlich ziemlich einfach (auf der Oberfläche).
Sie sollten sich den von beiden Schnittstellen definierten Vertrag ansehen. Ein IEnumerable ermöglicht Ihnen einfach, über eine Sequenz aufzuzählen. Mit anderen Worten, die einzige Möglichkeit, auf Daten zuzugreifen, ist die Verwendung eines Enumerators, typischerweise in einer foreach-Schleife. So eine naive Umsetzung der Zählfunktion wäre so etwas wie:
public static int Count(this IEnumerable<T> source) {
int count = 0;
foreach(var item in myEnumerable)
{
count++;
}
return count;
}
Das bedeutet, dass die Zeit benötigt, um die Anzahl der Elemente in Ihrem enumerable berechnen wird linear mit der Anzahl der Elemente zu erhöhen. Da dies intern nicht gespeichert wird, müssen Sie diese Schleife jedes Mal durchführen, wenn Sie eine Zählung wünschen.
Ein IList weist bereits eine Count-Eigenschaft auf. Dies ist Teil des Vertrags. Um Count() zu implementieren, würden Sie einfach einen Aufruf an die Count-Eigenschaft übergeben. Dies dauert die gleiche Zeit unabhängig von der Anzahl der Elemente.
Eine einfache Möglichkeit, darüber nachzudenken ist (vor allem mit Linq), ein IEnumerable als eine Spezifikation der Elemente, die Sie benötigen, zu denken. Solange Sie nicht auf die Daten zugreifen, kostet es Ihnen kaum Zeit zu bauen. Sobald Sie mit dem Aufzählen beginnen (alles, was im Grunde etwas anderes als ein IEnumerable zurückgibt), wird der Code ausgeführt und es könnte einige Zeit dauern.
Was ich normalerweise tun möchte, ist die Linq Ausführung im Controller zu halten. Also mache ich meine Abfrage-Erstellung, und dann ToList oder ToArray, bevor Sie es an die Ansicht senden. Der Grund ist ganz einfach: Wenn ich mehr tun muss, als nur auf die Daten in der Ansicht zuzugreifen, bedeutet das, dass ich meiner Meinung nach zu viel mache. Ich bin jetzt gezwungen, diese Logik auf meine Controller-Aktion zu übertragen und meine Ansichten so sauber wie möglich zu halten.
Welchen LINQ-Provider verwenden Sie (d. H. Wo kommen die Daten her?)? Welche Größe hat die Liste? – Oded
Aber 'result.ToList' würde in diesem Fall mit IEnumerable arbeiten. –
Was @ L.B versucht zu sagen ist, dass die Langsamkeit, die Sie sehen, nicht wegen der Verwendung von IEnumeralbe ist. –
Oded