Wenn ich eine Funktion habe, die eine Sammlung eines bestimmten Typs übernimmt, welchen Parametertyp sollte ich verwenden?
Ich habe bisher angenommen, IEnumerable
ist die Standardeinstellung, aber ich würde gerne wissen, ob das korrekt ist und wenn ja, warum.
ICollection
scheint auch wie ein gültiger Kandidat (aufgrund seines Namens), aber ich habe den Eindruck IEnumerables sind benutzerfreundlicher.
Ich dachte, dass die Beispiele, die das Framework uns gibt, eine gute Idee wären, aber ich finde, dass etwas wie String.Join
, nach einem Array von Strings fragt.Funktionsparameter: IEnumerable, ICollection oder Array?
Antwort
Sie nehmen die, die am wenigsten Clients auferlegt, aber Sie können Ihre Arbeit erledigen. Wenn Sie mit IEnumerable<T>
über ICollection<T>
durchkommen können, sollten Sie es verwenden, da dies den Clients Ihrer API größere Flexibilität bietet.
IEnumerable sind mehr bevorzugt als ICollections. Here ist die großzügige Antwort auf Ihre Frage.
Schnittstellen sind meist als Parameter oder Rückgabetypen in Funktionen verwendet, um die I
in SOLID
Design-Prinzipien (Interface Segregation Principle) für die Herstellung von Guss zu erleichtern, zu unterstützen vorbei mehrere konkrete Typen an die Schnittstelle Parameter und Ausblenden (Verkapselung) die tatsächliche Unterstützung Parametertyp von den Clients Ihrer öffentlichen Funktionen.
- über
IEnumerable
:
Sehr einfach, setzt es den Enumerator, der eine einfache Iteration über eine nicht-generische Sammlung unterstützt.
[ComVisibleAttribute(true)]
public interface IEnumerable
- hier über
ICollection
:
Die ICollection-Schnittstelle IEnumerable erstreckt; IDictionary und IList sind spezialisiertere Schnittstellen, die ICollection erweitern. Eine IDictionary-Implementierung ist eine Sammlung von Schlüssel/Wert-Paaren, wie die Hashtable-Klasse. Eine IList-Implementierung ist eine Sammlung von Werten, auf deren Member wie die ArrayList-Klasse per Index zugegriffen werden kann. Einige Auflistungen, die den Zugriff auf ihre Elemente beschränken, z. B. die Queue-Klasse und die Stack-Klasse, implementieren die ICollection-Schnittstelle direkt. Wenn weder die IDictionary-Schnittstelle noch die IList-Schnittstelle die Anforderungen der erforderlichen Sammlung erfüllen, leiten Sie stattdessen die neue Auflistungsklasse für mehr Flexibilität von der ICollection-Schnittstelle ab.
[ComVisibleAttribute(true)]
public interface ICollection : IEnumerable
Hier ist über
IList
Schnittstelle:[ComVisibleAttribute (true)] öffentliche Schnittstelle IList: ICollection, IEnumerable
Mehr von MSDN über IList: IList
ist ein Abkömmling der ICollection
Schnittstelle und ist die Basisschnittstelle aller nicht-generischen li st. IList-Implementierungen lassen sich in drei Kategorien einteilen: schreibgeschützt, feste Größe und variable Größe. Eine schreibgeschützte IList kann nicht geändert werden.Eine IList mit fester Größe erlaubt nicht das Hinzufügen oder Entfernen von Elementen, sondern ermöglicht die Änderung vorhandener Elemente. Ein IList mit variabler Größe ermöglicht das Hinzufügen, Entfernen und Ändern von Elementen.
Tipp:
Falls Sie nur
foreach
für Ihre Sammlung Parameter zu unterstützen, sollteIEnumerable
genug sein. Wenn Sie auch die Unterstützung für das Hinzufügen und Entfernen von Elementen aus der Sammlung möchten, ist dieIList
die bessere Wahl.
Vorschläge: Dieser Blog-Eintrag: IEnumerable, ICollection, IList Compared sollten Sie sicherlich helfen, besser und präzise Entscheidung zu treffen.
Weitere Informationen zu Leistung und anderen Vergleichen von IList und IEnumerable finden Sie unter this article.
-1: Ich könnte nicht mehr widersprechen. ** Always ** (für einen gegebenen Wert von always) verwende die minimale Abstraktion, die den Job erledigt, so dass dein Client-Code (der Code, den du schreibst) nicht darauf beschränkt ist, denselben Container zu verwenden, du bist die Funktion wird generischer und hat ein größeres Potenzial für die Wiederverwendung. –
Nun @BinaryWorrier Ich habe die Antwort aktualisiert, um IList zu verwenden, um eine Option nur zu sein, wenn die Unterstützung zum Hinzufügen oder Entfernen von Elementen erforderlich ist und IEnumerable zu verwenden, wenn nur foreach Unterstützung erforderlich ist .. Ich hoffe, dass Sie die Antwort jetzt besser verstanden .. – VS1
Entschuldigung aber ich stimme immer noch nicht zu. 'IEnumerable
- 1. Warum ArrayList IList, ICollection, IEnumerable implementieren?
- 2. In IEnumerable-Erweiterungen - warum ist nur Count() für ICollection optimiert?
- 3. Verwenden Sie Zeiger oder Array in Funktionsparameter
- 4. Benutzerdefinierte Sammlung mit IEnumerable vs ICollection vs IList
- 5. JavaScript-Funktionsparameter übergeben Array
- 6. C#, Pass Array als Funktionsparameter
- 7. Warum IList <T> implementieren IEnumerable <T> und ICollection <T> während ICollection <T> selbst IEnumerable implementiert <T>
- 8. Was ist die einfachste und kompakteste Möglichkeit, ein IEnumerable <T> oder ICollection <T> zu erstellen?
- 9. IEnumerable mit einem Array implementieren
- 10. Interessante IEnumerable (oder IQueryable) Erweiterungsmethoden
- 11. foreach auf IEnumerable oder IList
- 12. Funktionsparameter: Zeiger auf Array von Objekten
- 13. Ein Array als Funktionsparameter in JavaScript
- 14. Passing C-Array als char * Funktionsparameter
- 15. Übergeben Array zu Funktionsparameter in OpenCL
- 16. So erkennen Sie, ob ein Typ eine Liste oder ein Array oder IEnumerable ist oder
- 17. Zeiger auf Funktionsparameter vs Funktionsparameter?
- 18. OK, um eine interne Liste <T> als IEnumerable <T> oder ICollection <T> zurückzugeben?
- 19. Wie kann ich eine IEnumerable <T> zu einem bestehenden ICollection <T>
- 20. Mit Bezugsgrößen oder sie senden als Funktionsparameter
- 21. ICollection vs ICollection <T> - Ambiguität zwischen ICollection <T> .Count und ICollection.Count
- 22. konkrete Implementation von IEnumerable <T> das ist nicht ICollection <T>
- 23. Gibt es eine Einschränkung, Schnittstelle oder Klasse, die IEnumerable oder Array umhüllt?
- 24. Umwandlung Linq-Abfrage iCollection
- 25. mvc5 icollection immer null
- 26. Suche in ICollection Einheit
- 27. C# ICollection erhalten Einzelwert
- 28. IEnumerable enthält IEnumerable
- 29. System.Linq.Dynamic - Keine Eigenschaft oder Feld existiert in Typ ICollection
- 30. Stack <T> implementiert ICollection, hat aber Methoden von ICollection <T>
Diese haben vor hier beantwortet: http://stackoverflow.com/questions/3559868/list-ilist-ienumerable-iqueryable-icollection-which-is-most-flexible-return Beste Grüße. – Oscar
['String.Join'] (http://msdn.microsoft.com/en-us/library/dd992421.aspx) hatte eine Überladung im .NET 4 Zeitrahmen hinzugefügt, so dass es ein' IEnumerable' dauert. Die Überladung, die das Array annimmt, stammt von den vorgenerischen Tagen ... –
@Oscar: das ist über den Rückgabetyp - ich spreche Parameter. –