505 Stimmen

Wie kann ich ein Element zu einer IEnumerable<T>-Sammlung hinzufügen?

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> ?

3voto

Lrodriguez84 Punkte 586

Können Sie dies tun.

//Create IEnumerable    
IEnumerable<T> items = new T[]{new T("msg")};

//Convert to list.
List<T> list = items.ToList();

//Add new item to list.
list.add(new T("msg2"));

//Cast list to IEnumerable
items = (IEnumerable<T>)items;

2voto

telepuz Punkte 67

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:

  1. Wenn es sich bei der Instanz um eine Sammlung mit Schreib-API handelt (z. B. List), können Sie versuchen, auf diesen Typ zu casten:

IList<string> list = enumerableInstance as IList<string>;

  1. Erstellen einer Liste aus IEnumerable (z. B. über LINQ-Erweiterungsmethode toList() :

var list = enumerableInstance.toList();

1voto

Juha Sinkkonen Punkte 11

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

-2voto

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.

-7voto

Just N Observer Punkte 11

Natürlich können Sie das (ich lasse Ihr T-Geschäft beiseite):

public IEnumerable<string> tryAdd(IEnumerable<string> items)
{
    List<string> list = items.ToList();
    string obj = "";
    list.Add(obj);

    return list.Select(i => i);
}

CodeJaeger.com

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.

Powered by:

X