web-dev-qa-db-fra.com

Pourquoi IList ne prend-il pas en charge AddRange

List.AddRange() existe, mais IList.AddRange() n'existe pas.
Cela me semble étrange. Quelle en est la raison?

83
Boris Callens

Parce qu'une interface doit être facile à mettre en œuvre et ne pas contenir "tout sauf la cuisine". Si vous ajoutez AddRange, vous devez alors ajouter InsertRange et RemoveRange (pour la symétrie). Une meilleure question serait de savoir pourquoi il n'y a pas de méthodes d'extension pour le IList<T> interface similaire à la IEnumerable<T> interface. (des méthodes d'extension pour Sort, BinarySearch, ... sur place seraient utiles)

64
xanatos

Pour ceux qui veulent avoir des méthodes d'extension pour "AddRange", "Sort", ... sur IList,

Voici la méthode d'extension 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);
     }
}

J'ai créé une petite bibliothèque qui fait ça. Je trouve cela plus pratique que d'avoir à refaire ses méthodes d'extension sur chaque projet.

Certaines méthodes sont plus lentes que List mais elles font l'affaire.

Voici le GitHub pour les intéresser:

référentiel IListExtension

3
Emilien Mathieu