web-dev-qa-db-fra.com

comment ajouter une plage d'éléments à la variable IList

il n'y a pas de méthode AddRange() pour IList<T>.

Comment puis-je ajouter une liste d'éléments à un IList<T> Sans parcourir les éléments et en utilisant la méthode Add()?

58
mohsen dorparasti

AddRange est défini sur List<T>, pas l'interface.

Vous pouvez déclarer la variable comme List<T> au lieu de IList<T> ou le convertir en List<T> afin d'accéder à AddRange.

((List<myType>)myIList).AddRange(anotherList);
54
Oded

Si vous regardez le code source c # pour List , je pense que List.AddRange () a des optimisations qu'une simple boucle ne traite pas. Ainsi, une méthode d'extension devrait simplement vérifier si l'IList est une liste, et si c'est le cas, utiliser son AddRange () natif.

En fouillant le code source, vous voyez que les gens de .NET font des choses similaires dans leurs propres extensions Linq pour des choses comme .ToList () (s'il s'agit d'une liste, castez-la ... sinon créez-la).

public static class IListExtension
{
    public static void AddRange<T>(this IList<T> list, IEnumerable<T> items)
    {
        if (list == null) throw new ArgumentNullException("list");
        if (items == null) throw new ArgumentNullException("items");

        if (list is List<T>)
        {
            ((List<T>)list).AddRange(items);
        }
        else
        {
            foreach (var item in items)
            {
                list.Add(item);
            }
        }
    }
}
53
BlackjacketMack

Vous pouvez faire quelque chose comme ça:

 IList<string> oIList1 = new List<string>{"1","2","3"};
  IList<string> oIList2 = new List<string>{"4","5","6"};
  IList<string> oIList3 = oIList1.Concat(oIList2).ToList();

source

Donc, fondamentalement, vous utiliseriez l'extension concat et ToList () pour obtenir une fonctionnalité similaire à AddRange ().

19
Rayshawn

Vous pouvez également écrire une méthode d'extension comme celle-ci:

internal static class EnumerableHelpers
{
    public static void AddRange<T>(this IList<T> collection, IEnumerable<T> items)
    {
        foreach (var item in items)
        {
            collection.Add(item);
        }
    }
}

Usage:

        IList<int> collection = new int[10]; //Or any other IList
        var items = new[] {1, 4, 5, 6, 7};
        collection.AddRange(items);

Ce qui est toujours en cours d'itération sur les éléments, mais vous n'avez pas à écrire l'itération ou à lancer chaque fois que vous l'appelez.

7
bashis