List.AddRange()
existe, mais IList.AddRange()
pas.
Cela me paraît étrange. Quelle est la raison derrière cela?
89
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 l' IList<T>
interface similaires à l' IEnumerable<T>
interface. (méthodes d'extension pour en place Sort
, BinarySearch
... serait utile)
AddRange/RemoveRange/InsertRange
peut travailler directement sur la collecte «interne» et optimiser laCapacity
gestion et utiliser des méthodes commeArray.Copy
le déplacement de blocs de données. Une méthode d'extensionRemoveRange
serait probablement un ordre de grandeur plus lent queList.RemoveRange
IFoo
déclaration d' interface (par exemple ) de spécifier un espace de noms "helper" (par exempleMyAssembly
) de telle sorte que si une classe prétend implémenterIFoo
mais manque de méthodeint Bar(String)
, le compilateur serait automatiquement generate methodint IFoo.Bar(String p1) {return MyAssembly.ClassHelpers.IFoo.Bar(this, p1);}
Si une telle fonctionnalité avait existé, les interfaces auraient pu inclure plus de méthodes comme cellesAddRange
qui pourraient être implémentées en termes de comportement de base, mais que certaines implémentations pourraient optimiser.Pour ceux qui veulent avoir des méthodes d'extension pour "AddRange", "Sort", ... sur IList,
Voici la
AddRange
méthode d'extension: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 cela. Je trouve cela plus pratique que de devoir refaire ses méthodes d'extension sur chaque projet.
Certaines méthodes sont plus lentes que List, mais elles font le travail.
Voici le GitHub pour les intéresser:
Dépôt IListExtension
la source