Voici comment j'ajouterais un élément à un objet IEnumerable:
//Some IEnumerable<T> object
IEnumerable<string> arr = new string[] { "ABC", "DEF", "GHI" };
//Add one item
arr = arr.Concat(new string[] { "JKL" });
C'est gênant. Cependant, je ne vois pas de méthode appelée quelque chose comme ConcatSingle()
.
Existe-t-il un moyen plus propre d'ajouter un seul élément à un objet IEnumerable?
Non, c'est à peu près aussi concis que vous obtiendrez en utilisant les fonctionnalités de langage/framework intégrées.
Vous pouvez toujours créer une méthode d'extension si vous préférez:
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
est immuable collection, cela signifie que vous ne pouvez pas ajouter ou supprimer d'élément. Au lieu de cela, vous devez créer une nouvelle collection pour cela, simplement convertir en liste pour ajouter:
var newCollection = arr.ToList();
newCollection.Add("JKL"); //is your new collection with the item added
Écrire une méthode d'extension ConcatSingle
:)
public static IEnumerable<T> ConcatSingle<T>(this IEnumerable<T> source, T item)
{
return source.Concat(new [] { item } );
}
Mais vous devez être plus prudent avec votre terminologie.
Vous ne pouvez pas ajouter un élément à un IEnumerable<T>
. Concat
crée une nouvelle instance.
Exemple:
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
Comme vous pouvez le voir, l'énumération d'origine - que nous avons enregistrée dans original
n'a pas changé.
Puisque IEnumerable
est en lecture seule, vous devez convertir en liste.
var new_one = arr.ToList().Add("JKL");
Ou vous pouvez obtenir un méthode d'extension comme;
public static IEnumerable<T> Append<T>(this IEnumerable<T> source, params T[] item)
{
return source.Concat(item);
}
Vous attribuez un tableau à un IEnumerable. Pourquoi n'utilisez-vous pas le type Array au lieu de IEnumerable?
Sinon, vous pouvez utiliser IList (ou List) si vous souhaitez modifier la collection.
J'utilise IEnumerable uniquement pour les paramètres des méthodes lorsque j'ai besoin de lire et IList (ou List) lorsque j'ai besoin de modifier des éléments.