moh*_*sti 64 c# collections list addrange
没有AddRange()办法IList<T>.
如何在IList<T>不迭代项目和使用Add()方法的情况下将项目列表添加到a ?
Bla*_*ack 56
如果你查看List的c#源代码,我认为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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ode*_*ded 55
AddRange是定义List<T>,而不是接口.
您可以将变量声明为List<T>代替IList<T>或转换List<T>为以获取访问权限AddRange.
((List<myType>)myIList).AddRange(anotherList);
Run Code Online (Sandbox Code Playgroud)
Ray*_*awn 20
你可以这样做:
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();
Run Code Online (Sandbox Code Playgroud)
所以,基本上你会使用concat扩展和ToList()来获得与AddRange()类似的功能.
您还可以编写这样的扩展方法:
internal static class EnumerableHelpers
{
public static void AddRange<T>(this IList<T> collection, IEnumerable<T> items)
{
foreach (var item in items)
{
collection.Add(item);
}
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
IList<int> collection = new int[10]; //Or any other IList
var items = new[] {1, 4, 5, 6, 7};
collection.AddRange(items);
Run Code Online (Sandbox Code Playgroud)
它仍在迭代项目,但您不必在每次调用时编写迭代或转换.