如何将一系列项目添加到IListvariables
对于IList<T>
没有AddRange()
方法。
如何添加项目列表到IList<T>
而不迭代项目和使用Add()
方法?
AddRange
在List<T>
上定义,而不是接口。
您可以将variables声明为List<T>
而不是IList<T>
或将其转换为List<T>
以访问AddRange
。
((List<myType>)myIList).AddRange(anotherList);
如果你看看List的c#源代码 ,我认为List.AddRange()有一个简单的循环无法解决的优化问题。 所以,扩展方法应该简单地检查IList是否是一个List,如果是的话,使用它的本地AddRange()。
在源代码的周围,你会看到.NET的人在他们自己的Linq扩展中做类似的事情,比如.ToList()(如果是列表,则抛出它,否则就创build它)。
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); } } } }
你可以做这样的事情:
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()类似的function。
你也可以写这样的扩展方法:
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);
这仍然是迭代项目,但是你不必每次都调用迭代或投射。
var var1 = output.listDepartment1 var var2 = output.listDepartment2 var1.AddRange(var2); var list = var1;