如何将一系列项添加到IList变量

时间:2012-10-31 12:36:45

标签: c# list collections addrange

AddRange()没有IList<T>方法。

如何在不迭代项目和使用IList<T>方法的情况下向Add()添加项目列表?

6 个答案:

答案 0 :(得分:52)

AddRangeList<T>上定义,而不是在界面上定义。

您可以将变量声明为List<T>而不是IList<T>,或将其转换为List<T>,以便获得对AddRange的访问权。

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

答案 1 :(得分:50)

如果查看c# source code for List,我认为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);
            }
        }
    }
}

答案 2 :(得分:18)

你可以这样做:

 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

所以,基本上你会使用concat扩展和ToList()来获得与AddRange()类似的功能。

答案 3 :(得分:7)

您还可以编写如下的扩展方法:

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

仍在迭代项目,但您不必在每次调用时编写迭代或转换。

答案 4 :(得分:1)

使用LINQ的另一个答案,条件是您要添加的内容是List<T>或可以在其上调用ToList()

IEnumerable<string> toAdd = new string[] {"a", "b", "c"};
IList<string> target = new List<string>();

toAdd.ToList().ForEach(target.Add);

答案 5 :(得分:-1)

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