没有AddRange()
方法IList<T>
。
如何在IList<T>
不遍历项目和使用Add()
方法的情况下向中添加项目列表?
没有AddRange()
方法IList<T>
。
如何在IList<T>
不遍历项目和使用Add()
方法的情况下向中添加项目列表?
Answers:
AddRange
在上定义List<T>
,而不是在接口上定义。
您可以将变量声明为,List<T>
而不是IList<T>
或将其List<T>
强制转换为访问AddRange
。
((List<myType>)myIList).AddRange(anotherList);
这是不好的做法(见下面的评论),作为一个IList<T>
实力不为List<T>
,但实现的接口,并很可能不会有一些其他类型的AddRange
方法-在这种情况下,你只会发现当你的代码引发运行时异常。
因此,除非您确定该类型确实是a,否则List<T>
不应尝试使用AddRange
。
if(myIList is List<T>)
{
// can cast and AddRange
}
else
{
// iterate with Add
}
List<T>
(或者,如果这对您而言不是一个不错的选择,请在需要将AddRange
其保持本地化的位置进行强制转换-这是一种非常低成本的操作)。
InvalidCastException
在非List<T>
数组(例如数组)上使用的东西。
如果您看一下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(nameof(list));
if (items == null) throw new ArgumentNullException(nameof(items));
if (list is List<T> asList)
{
asList.AddRange(items);
}
else
{
foreach (var item in items)
{
list.Add(item);
}
}
}
}
list
进行List<T>
两次铸造。其中之一可以用as
关键字优化。
if (list is List<T> castedList) { castedList.AddRange(items); }
您可以执行以下操作:
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()
。
Enumerable.Concat
是由实现的,System.Linq.Enumerable
并且该方法的返回值是IEnumerable<TSource>
,因此我认为不应将其强制转换为IList<TSource>
-由于我们不了解源代码就无法实现的实现细节,它可能会返回其他内容-即使不能保证它不会改变-所以在支持多个.NET版本时必须特别注意。
您还可以编写如下扩展方法:
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;
Concat
就像@Self_Taught_Programmer回答的那样,强制转换或使用LINQ 。