2010-08-21 16 views
13

Was ist eine effizientere Möglichkeit, Methoden IList<T> oder IEnumerable<T> zurückgeben?IList <T> vs IEnumerable <T>. Was ist effizienter IList <T> oder IEnumerable <T>

IEnumerable<T> es ist unveränderliche Sammlung aber IList<T> veränderbar und enthält viele nützliche Methoden und Eigenschaften.

Um IList<T>-IEnumerable<T> zu werfen auf sie verweisen nur Kopie:

IList<T> l = new List<T>(); 
IEnumerable<T> e = l; 

IEnumerable<T> zu List<T> wir jedes Element durchlaufen müssen, um werfen oder ToList() Methode aufzurufen:

IEnumerable<T>.ToList(); 

oder IEnumerable<T> passieren kann zu List<T> Konstruktor, der die gleiche Iteration irgendwo innerhalb seines Konstruktors ausführt.

List<T> l = new List<T>(e); 

Welche Fälle halten Sie für effizienter? Welche bevorzugen Sie in Ihrer Praxis?

Antwort

21

In Bezug auf Effizienz sind beide Schnittstellen, so dass die Effizienz von der konkreten Betonklasse abhängt, die Sie zurückgeben. Als Faustregel sollte immer der höchste Typ in der Objekthierarchie zurückgegeben werden, der für die Konsumenten dieser Methode funktioniert. In Ihrem Fall IEnumerable<T>. Wenn die Benutzer der Klasse Elemente hinzufügen müssen, greifen Sie auf Elemente nach Index zu, entfernen Sie die Elemente, die Sie am besten verwenden, mit einem IList<T>.

So wie immer in der Programmierung: es hängt :-)

+0

Zum Beispiel, wenn ich Methode implementiert, die ‚IEnumerable ‘ und dann auf einem anderen Entwicklungsstadium zurück i muss möglicherweise, dass ‚IList ‘ hieven Fall muss ich 'IEnumerable ' zu 'IList '. Auch ich kann diese Methode kopieren, um eine neue zu erstellen, die 'IList ' zurückgibt. Aber ich denke nicht, dass Duplikation eine gute Wahl ist. Aber um von 'IEnumerable ' zu 'IList ' zu konvertieren, ist es nur Referenzkopie eine andere Möglichkeit 'IList ' zu 'IEnumerable ' ist es jedes Element kopieren. Die Erstellung von 'IList ' erforderte jedoch mehr Ressourcen als die Erstellung von 'IEnumerable '. – Kuncevic

+0

Nein, das sind Schnittstellen. Sie sind nur Verträge, die keine Ressourcen benötigen. Nur konkrete Klassen nehmen Ressourcen auf. Wenn Sie die Erweiterungsmethode 'ToList' auf einem' IEnumerable 'aufrufen, erstellt dies einfach eine' neue Liste 'und füttert das Enumerable dem Konstruktor. Natürlich werden die zugrunde liegenden Elemente nicht dupliziert, so dass Sie einfach ein Objekt instanziieren, das nicht viel Speicher benötigen sollte. Der zugrunde liegende Aufzählungswert wird als Referenz gespeichert. –

+1

Ja, ich stimme zu, "gebe immer den Typ zurück, der in der Objekthierarchie am höchsten ist", es ist definitiv so, wie es sein sollte. Ich denke, es ist die Antwort auf diese Frage. – Kuncevic

Verwandte Themen