List.AddRange()
存在しますが、存在IList.AddRange()
しません。
これは奇妙なことに私を襲う。これの背後にある理由は何ですか?
回答:
インターフェースは実装が簡単で、「キッチン以外のすべて」が含まれていない必要があるためです。追加するAddRange
場合は、InsertRange
andを追加する必要がありますRemoveRange
(対称性のため)。より良い質問は、IList<T>
インターフェイスに似たインターフェイスの拡張メソッドがない理由IEnumerable<T>
です。(インプレースのための拡張メソッドをSort
、BinarySearch
、...有用であろう)
IFoo
(eg MyAssembly
)が「ヘルパー」名前空間(eg )を指定する方法がなかった(そしてまだそうではない)のは残念です。クラスが実装を主張しているIFoo
がメソッドがない場合int Bar(String)
、コンパイラは自動的に生成メソッドint IFoo.Bar(String p1) {return MyAssembly.ClassHelpers.IFoo.Bar(this, p1);}
このような機能が存在する場合、インターフェイスにAddRange
は、基本動作の観点から実装できるが、一部の実装では最適化できるような、より多くのメソッドが含まれている可能性があります。
IListで「AddRange」、「Sort」、...の拡張メソッドが必要な場合は、
以下はAddRange
拡張方法です:
public static void AddRange<T>(this IList<T> source, IEnumerable<T> newList)
{
if (source == null)
{
throw new ArgumentNullException(nameof(source));
}
if (newList == null)
{
throw new ArgumentNullException(nameof(newList));
}
if (source is List<T> concreteList)
{
concreteList.AddRange(newList);
return;
}
foreach (var element in newList)
{
source.Add(element);
}
}
これを行う小さなライブラリを作成しました。プロジェクトごとに拡張メソッドをやり直すよりも実用的だと思います。
一部のメソッドはListよりも低速ですが、機能します。
これが彼らに興味を持ってもらうためのGitHubです:
AddRange/RemoveRange/InsertRange
は「内部」コレクションに直接作用し、Capacity
管理を最適化し、Array.Copy
データのブロックを移動するような方法を使用できます。拡張方法RemoveRange
は、おそらく、より遅いマグニチュードのオーダーになりますList.RemoveRange