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?
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);
}
}
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
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.
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);
}
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.