AddRange()の方法はありませんIList<T>。
IList<T>アイテムを反復処理せずにAdd()メソッドを使用せずに、アイテムのリストをに追加するにはどうすればよいですか?
AddRange()の方法はありませんIList<T>。
IList<T>アイテムを反復処理せずにAdd()メソッドを使用せずに、アイテムのリストをに追加するにはどうすればよいですか?
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);
}
}
}
}
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
}
次のようなことができます。
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()。