web-dev-qa-db-ja.com

アイテムの範囲をIList変数に追加する方法

_IList<T>_にはAddRange()メソッドはありません。

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

58

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

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

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

Listのc#ソースコード を見ると、List.AddRange()には、単純なループでは対応できない最適化があると思います。そのため、拡張メソッドは、IListがリストであるかどうかを確認し、そうである場合はネイティブの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("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);
            }
        }
    }
}
53
BlackjacketMack

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

 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()と同様の機能を取得します。

19
Rayshawn

次のような拡張メソッドを書くこともできます。

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

これはまだ項目を繰り返し処理していますが、呼び出すたびに繰り返しを記述したりキャストしたりする必要はありません。

7
bashis