[英]How to add a range of items to an IList?
IList<T>
沒有AddRange()
方法。
如何將項目列表添加到IList<T>
而不遍歷項目並使用Add()
方法?
如果您查看List<T>的C# 源代碼,我認為 List<T>.AddRange() 具有簡單循環無法解決的優化。 因此,擴展方法應該簡單地檢查 IList<T> 是否是 List<T>,如果是,則使用其原生 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);
}
}
}
}
AddRange
在List<T>
上定義,而不是在接口上定義。
您可以將變量聲明為List<T>
而不是IList<T>
或將其AddRange
為List<T>
以獲得對AddRange
訪問AddRange
。
((List<myType>)myIList).AddRange(anotherList);
這不是一個好的做法(請參閱下面的評論),因為IList<T>
可能不是List<T>
,而是實現了接口的其他一些類型並且很可能沒有AddRange
方法 - 在這種情況下,您只會發現您的代碼在運行時何時拋出異常。
因此,除非您確定該類型確實是List<T>
,否則不應嘗試使用AddRange
。
一種方法是使用is或as運算符測試類型(自 C# 7 起)。
if(myIList is List<T>)
{
// can cast and AddRange
}
else
{
// iterate with Add
}
你可以這樣做:
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()
類似的功能。
您還可以編寫這樣的擴展方法:
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 MyCustomList(); //Or any other IList except for a fixed-size collection like an array
var items = new[] {1, 4, 5, 6, 7};
collection.AddRange(items);
它仍在迭代項目,但您不必每次調用它時都編寫迭代或強制轉換。
使用 LINQ 的另一個答案,前提是您添加的是List<T>
或者您可以在其上調用ToList()
:
IEnumerable<string> toAdd = new string[] {"a", "b", "c"};
IList<string> target = new List<string>();
toAdd.ToList().ForEach(target.Add);
IList 沒有 AddRange() ,但有結合你的集合的 Concat()
var var1 = output.listDepartment1
var var2 = output.listDepartment2
var1.AddRange(var2);
var list = var1;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.