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