IEnumerable zu IReadOnlyCollection
Habe ich IEnumerable<Object>
und weitergeben müssen, um eine Methode als parameter, aber diese Methode dauert IReadOnlyCollection<Object>
Ist es möglich, zu konvertieren IEnumerable<Object>
zu IReadOnlyCollection<Object>
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine Möglichkeit wäre, eine Liste erstellen, und rufen Sie
AsReadOnly()
drauf:Diese produziert
ReadOnlyCollection<Objekt>
, die implementiertIReadOnlyCollection<Object>
.Hinweis: Seit
List<T>
implementiertIReadOnlyCollection<T>
sowie der AufrufAsReadOnly()
ist optional. Obwohl es möglich ist, rufen Sie Ihre Methode mit dem Ergebnis derToList()
ich lieber mitAsReadOnly()
, so dass die Leser von meinem code sehen würde, dass die Methode, die ich Vorschlage, hat nicht die Absicht zu ändern auf meiner Liste. Natürlich könnten Sie herausfinden, die gleiche Sache, indem man die Signatur der Methode, die ich Vorschlage, aber es ist schön zu explizit über es..AsReadOnly()
hat seine verwendet. Wenn Sie gerade zurückList<T>
jemand tun kann, einerdOnly is IList<T>
und zurücktrue
, wenn Sie.AsReadOnly()
es zurückfalse
. Wenn ich nicht weiß, ob mein Verbraucher könnten möglicherweise versuchen zu casten mein Ergebnis in einem mutable-Schnittstelle, die ich oft eine.AsReadOnly()
bevor ich das Ergebnis zurückgeben.Als alternative zu dasblinkenlight Antwort, um zu verhindern, dass der Anrufer casting zu List<T>, anstatt das zu tun
orig.ToList().AsReadOnly()
, Folgendes könnte besser sein:Es ist die gleiche Anzahl der Methodenaufrufe, aber man nimmt die anderen als parameter, statt dazu aufgerufen, der Rückgabewert.
Da die anderen Antworten scheinen zu lenken in die Richtung, die der Verpackung der Sammlungen in einer wirklich nur-lese-Typ, lassen Sie mich dies hinzufügen.
Ich habe selten, wenn überhaupt, gesehen, eine situation, wo der Anrufer ist so verängstigt, dass ein
IEnumerable<T>
-Einnahme-Methode könnte in böser Absicht versuchen zu casten, dassIEnumerable<T>
zurück zu einemList
oder andere veränderliche Art, und starten Sie mutiert es. Cue-Orgel-Musik und das böse lachen!Nicht. Wenn der code mit der Sie arbeiten, auch nur im entferntesten angemessen, dann, wenn es fordert einen Typ, der nur lese-Funktionalität (
IEnumerable<T>
,IReadOnlyCollection<T>
...), es wird nur gelesen.Verwenden
ToList()
und mit ihm getan werden.Als Seite beachten, wenn Sie die Methode in Frage, generell ist es am besten zu Fragen, für nicht mehr als eine
IEnumerable<T>
, der angibt, dass Sie "möchte einfach nur ein paar Artikel zu Lesen". Ob oder nicht Sie müssen IhreCount
oder müssen auflisten, mehrere Male ist eine Implementierung detail, und ist sicherlich anfällig für ändern. Wenn Sie mehrere enumeration, einfach dies tun:Damit bleibt die Verantwortung, wo Sie hingehört (möglichst lokal) und die Signatur der Methode bereinigen.
Wenn Rückkehr eine Reihe von Elementen, auf der anderen Seite, ich bevorzuge, um eine
IReadOnlyCollection<T>
. Warum? Das Ziel ist es, dem Anrufer etwas, das erfüllt reasonsable Erwartungen - nicht mehr, nicht weniger. Diese Erwartungen sind in der Regel, dass die Sammlung verwirklicht wird und dass dieCount
bekannt ist - genau das, wasIReadOnlyCollection<T>
bietet (und eine einfacheIEnumerable<T>
nicht). Indem nicht mehr spezifische als dieses, unser Vertrag entspricht den Erwartungen, und die Methode ist immer noch änderungen an der zugrunde liegenden Auflistung. (Im Gegensatz dazu, wenn eine Methode gibt einList<T>
, es macht mich Frage mich, was Kontext ist, dass, ich möchte einen index in der Liste aus und mutieren... und die Antwort ist meist "keine".)