wake-up-neo.com

Wie füge ich einem IEnumerable <T> am besten ein Element hinzu?

So fügen Sie einem IEnumerable-Objekt ein Element hinzu:

//Some IEnumerable<T> object
IEnumerable<string> arr = new string[] { "ABC", "DEF", "GHI" };

//Add one item
arr = arr.Concat(new string[] { "JKL" });

Das ist umständlich. Ich sehe jedoch keine Methode mit dem Namen ConcatSingle().

Gibt es eine sauberere Möglichkeit, einem IEnumerable-Objekt ein einzelnes Element hinzuzufügen?

25
user2023861

Nein, das ist ungefähr so ​​präzise, ​​wie Sie es von den integrierten Sprach-/Framework-Funktionen erwarten.

Sie können jederzeit eine Erweiterungsmethode erstellen, wenn Sie möchten:

arr = arr.Append("JKL");
// or
arr = arr.Append("123", "456");
// or
arr = arr.Append("MNO", "PQR", "STU", "VWY", "etc", "...");

// ...

public static class EnumerableExtensions
{
    public static IEnumerable<T> Append<T>(
        this IEnumerable<T> source, params T[] tail)
    {
        return source.Concat(tail);
    }
}
16
LukeH

IEnumerable ist nveränderlich Sammlung, dh Sie können keine Elemente hinzufügen oder entfernen. Stattdessen erstellen Sie müssen eine neue Sammlung, um sie einfach in eine Liste umzuwandeln und hinzuzufügen:

var newCollection = arr.ToList();
newCollection.Add("JKL"); //is your new collection with the item added
8
cuongle

Schreibe eine Erweiterungsmethode ConcatSingle :)

public static IEnumerable<T> ConcatSingle<T>(this IEnumerable<T> source, T item)
{
    return source.Concat(new [] { item } );
}

Aber Sie müssen mit Ihrer Terminologie vorsichtiger sein.
Sie können einem IEnumerable<T> Keinen Artikel hinzufügen. Concat erstellt eine neue Instanz.

Beispiel:

var items = Enumerable.Range<int>(1, 10)
Console.WriteLine(items.Count()); // 10
var original= items;
items = items.ConcatSingle(11);
Console.WriteLine(original.Count());   // 10
Console.WriteLine(items.Count()); // 11

Wie Sie sehen, hat sich die ursprüngliche Aufzählung, die wir in original gespeichert haben, nicht geändert.

7
Daniel Hilgarth

Da IEnumerable schreibgeschützt ist, müssen Sie in eine Liste konvertieren.

var new_one = arr.ToList().Add("JKL");

Oder Sie können eine Erweiterungsmethode wie erhalten;

public static IEnumerable<T> Append<T>(this IEnumerable<T> source, params T[] item)
{
    return source.Concat(item);
}
6
Soner Gönül

Sie weisen einem IEnumerable ein Array zu. Warum verwenden Sie nicht den Array-Typ anstelle von IEnumerable?

Andernfalls können Sie IList (oder List) verwenden, wenn Sie die Sammlung ändern möchten.

Ich verwende IEnumerable nur für Methodenparameter, wenn ich sie lesen muss, und IList (oder List), wenn ich Elemente darin ändern muss.

2
Caelan