web-dev-qa-db-ja.com

IListがAddRangeをサポートしない理由

List.AddRange()は存在しますが、IList.AddRange()は存在しません。
これは奇妙に思えます。この背後にある理由は何ですか?

83
Boris Callens

インターフェイスは実装が簡単で、「キッチン以外のすべて」を含まないためです。 AddRangeを追加する場合は、InsertRangeRemoveRange(対称)を追加する必要があります。より良い質問は、IList<T>インターフェースに似たIEnumerable<T>インターフェースの拡張メソッドがない理由です。 (インプレースSortBinarySearch、...の拡張メソッドが便利です)

64
xanatos

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

これを行う小さなライブラリを作成しました。各プロジェクトで拡張メソッドをやり直すよりも実用的です。

いくつかのメソッドはリストより遅いですが、仕事をします。

それらに興味を持たせるGitHubは次のとおりです。

IListExtensionリポジトリ

3
Emilien Mathieu