List.AddRange()
existe, mais IList.AddRange()
pas.
Cela me paraît étrange. Quelle est la raison derrière cela?
List.AddRange()
existe, mais IList.AddRange()
pas.
Cela me paraît étrange. Quelle est la raison derrière cela?
Réponses:
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)
IFoo
déclaration d' interface (par exemple ) de spécifier un espace de noms "helper" (par exemple MyAssembly
) de telle sorte que si une classe prétend implémenter IFoo
mais manque de méthode int Bar(String)
, le compilateur serait automatiquement generate method int 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 celles AddRange
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:
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