90

AddRange()の方法はありませんIList<T>

IList<T>アイテムを反復処理せずにAdd()メソッドを使用せずに、アイテムのリストをに追加するにはどうすればよいですか?

4

6 に答える 6

90

List<T> のC# ソース コードを見ると、List<T>.AddRange() には、単純なループでは対処できない最適化があると思います。したがって、拡張メソッドは IList<T> が List<T> であるかどうかを確認するだけでよく、そうであればネイティブの AddRange() を使用します。

ソース コードを調べてみると、.NET 関係者が .ToList() などの独自の LINQ 拡張機能で同様のことを行っていることがわかります (リストの場合はキャストし、それ以外の場合は作成します)。

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);
            }
        }
    }
}
于 2015-10-13T13:36:30.137 に答える
72

AddRangeインターフェイスではなくで定義されList<T>ます。

にアクセスするために、List<T>代わりに変数を宣言するIList<T>か、にキャストすることができます。List<T>AddRange

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

これは良い習慣ではありIList<T>ませ(以下のコメントを参照) 。実行時の例外。List<T>AddRange

したがって、型が実際に aList<T>であることが確実にわかっている場合を除き、 を使用しないでくださいAddRange

これを行う 1 つの方法は、 isまたはas演算子を使用して型をテストすることです(C# 7 以降)。

if(myIList is List<T>)
{
   // can cast and AddRange
}
else
{
   // iterate with Add
}
于 2012-10-31T12:39:02.087 に答える
24

次のようなことができます。

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()

ソース

于 2012-10-31T12:39:07.610 に答える