簡體   English   中英

如何將一系列項目添加到 IList?

[英]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);
            }
        }
    }
}

AddRangeList<T>上定義,而不是在接口上定義。

您可以將變量聲明為List<T>而不是IList<T>或將其AddRangeList<T>以獲得對AddRange訪問AddRange

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

這不是一個好的做法(請參閱下面的評論),因為IList<T>可能不是List<T> ,而是實現了接口的其他一些類型並且很可能沒有AddRange方法 - 在這種情況下,您只會發現您的代碼在運行時何時拋出異常。

因此,除非您確定該類型確實是List<T> ,否則不應嘗試使用AddRange

一種方法是使用isas運算符測試類型(自 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM