Meine Frage als Titel oben. Zum Beispiel
IEnumerable<T> items = new T[]{new T("msg")};
items.ToList().Add(new T("msg2"));
aber es ist ja nur 1 Gegenstand drin. Können wir eine Methode haben wie items.Add(item)
wie die List<T>
?
Meine Frage als Titel oben. Zum Beispiel
IEnumerable<T> items = new T[]{new T("msg")};
items.ToList().Add(new T("msg2"));
aber es ist ja nur 1 Gegenstand drin. Können wir eine Methode haben wie items.Add(item)
wie die List<T>
?
Instanzen, die IEnumerable und IEnumerator (zurückgegeben von IEnumerable) implementieren, haben keine APIs, die das Ändern von Sammlungen erlauben, die Schnittstelle bietet nur Lese-APIs.
Die 2 Möglichkeiten, die Sammlung tatsächlich zu verändern:
IList<string> list = enumerableInstance as IList<string>;
toList()
:var list = enumerableInstance.toList();
Der einfachste Weg, dies zu tun, ist
IEnumerable<T> items = new T[]{new T("msg")};
List<string> itemsList = new List<string>();
itemsList.AddRange(items.Select(y => y.ToString()));
itemsList.Add("msg2");
Dann können Sie Liste als IEnumerable auch zurückgeben, weil es IEnumerable-Schnittstelle implementiert
Entschuldigung für die Wiederbelebung einer wirklich alten Frage, aber da sie unter den ersten Google-Suchergebnissen aufgeführt ist, gehe ich davon aus, dass einige Leute immer wieder hier landen.
Unter den vielen Antworten, von denen einige wirklich wertvoll und gut erklärt sind, möchte ich einen anderen Gesichtspunkt hinzufügen, da das Problem meiner Meinung nach nicht gut erkannt wurde.
Sie deklarieren eine Variable, die Daten speichert. Sie müssen diese Variable ändern können, indem Sie ihr Elemente hinzufügen? Sie sollten sie also nicht als IEnumerable deklarieren.
Wie von @NightOwl888 vorgeschlagen
Für dieses Beispiel deklarieren Sie einfach IList anstelle von IEnumerable: IList items = new T[]{new T("msg")}; items.Add(new T("msg2"));
Der Versuch, die angegebenen Schnittstellenbeschränkungen zu umgehen, zeigt nur, dass Sie die falsche Wahl getroffen haben. Darüber hinaus sollten alle Methoden, die vorgeschlagen werden, um Dinge zu implementieren, die bereits in anderen Implementierungen vorhanden sind, nicht in Betracht gezogen werden. Klassen und Schnittstellen, die das Hinzufügen von Elementen ermöglichen, gibt es bereits. Warum immer wieder Dinge nachbilden, die bereits anderswo realisiert sind?
Diese Art der Berücksichtigung ist ein Ziel der Abstraktion von Variablenfähigkeiten innerhalb von Schnittstellen.
TL;DR: IMO sind dies die saubersten Wege zu tun, was Sie brauchen:
// 1st choice : Changing declaration
IList<T> variable = new T[] { };
variable.Add(new T());
// 2nd choice : Changing instantiation, letting the framework taking care of declaration
var variable = new List<T> { };
variable.Add(new T());
Wenn Sie die Variable als IEnumerable verwenden müssen, können Sie das tun. Wenn Sie sie als Array verwenden müssen, können Sie 'ToArray()' aufrufen, so einfach sollte es immer sein. Keine Erweiterungsmethode erforderlich, Casts nur, wenn wirklich benötigt, die Fähigkeit, LinQ auf Ihre Variable zu verwenden, etc ...
Hören Sie auf, seltsame und/oder komplexe Dinge zu tun, nur weil Sie bei der Erklärung/Instantiierung einen Fehler gemacht haben.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.