97

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

4

2 に答える 2

71

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

于 2012-07-18T09:37:14.997 に答える
15

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です:

IListExtensionリポジトリ

于 2019-07-31T12:04:10.050 に答える