web-dev-qa-db-fra.com

Quelle est la meilleure façon d'ajouter un élément à un IEnumerable <T>?

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?

25
user2023861

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);
    }
}
16
LukeH

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
8
cuongle

É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é.

7
Daniel Hilgarth

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);
}
6
Soner Gönül

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.

2
Caelan