Подтвердить что ты не робот

Как добавить диапазон элементов в переменную IList

для IList<T> нет метода AddRange().

Как добавить список элементов в IList<T> без итерации через элементы и с помощью метода Add()?

4b9b3361

Ответ 1

AddRange определяется на List<T>, а не в интерфейсе.

Вы можете объявить переменную как List<T> вместо IList<T> или применить ее к List<T>, чтобы получить доступ к AddRange.

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

Ответ 2

Если вы посмотрите на С# исходный код для списка, я думаю, что List.AddRange() имеет оптимизации, которые простой цикл не адресует, Таким образом, метод расширения должен просто проверять, является ли IList List, и если так, используйте его собственный AddRange().

Выбирая исходный код, вы видите, что люди .NET делают подобные вещи в своих собственных расширениях Linq для таких вещей, как .ToList() (если это список, отбросьте его... в противном случае создайте его).

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

Ответ 3

Вы можете сделать что-то вроде этого:

 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();

источник

Итак, в основном вы использовали бы расширение concat и ToList(), чтобы получить аналогичную функциональность как AddRange().

Ответ 4

Вы также можете написать метод расширения следующим образом:

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

Использование:

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

который по-прежнему выполняет итерацию по элементам, но вам не нужно писать итерацию или прикладывать ее каждый раз, когда вы вызываете ее.

Ответ 5

var var1 = output.listDepartment1
var var2 = output.listDepartment2  
var1.AddRange(var2);
var list = var1;