141 votes

Ajouter une collection à une collection

Un collègue m'a demandé aujourd'hui comment ajouter une plage à une collection. Il a une classe qui hérite de la Collection<T>. Il y a une seule propriété de ce type qui contient déjà quelques éléments. Il veut ajouter des éléments dans une autre collection de la collection de propriété. Comment peut-il le faire en C#3-amicale de la mode? (Note de la contrainte sur la seule propriété, ce qui empêche des solutions comme faire de l'Union et de réaffectation.)

Bien sûr, un foreach avec la Propriété.Ajoutez de travail. Mais une Liste<T>style AddRange serait beaucoup plus élégant.

Il est assez facile d'écrire une extension de la méthode:

public static class CollectionHelpers
{
    public static void AddRange<T>(this ICollection<T> destination,
                                   IEnumerable<T> source)
    {
        foreach (T item in source)
        {
            destination.Add(item);
        }
    }
}

Mais j'ai le sentiment que je suis en train de réinventer la roue. Je n'ai rien trouvé de semblable dans le Système.Linq ou morelinq.

Mauvaise conception? Appelez Simplement Ajouter? Manque évident?

74voto

Reed Copsey Points 315315

Non, cela semble parfaitement raisonnable. Il existe une méthode List<T>. AddRange () qui fait essentiellement cela, mais nécessite que votre collection soit concrète List<T> .

21voto

jvitor83 Points 180

N'oubliez pas que chaque Add vérifiera la capacité de la collection et la redimensionnera chaque fois que nécessaire (plus lentement). Avec AddRange , la collection définira la capacité, puis les éléments seront ajoutés (plus rapidement). Cette méthode d'extension sera extrêmement lente, mais fonctionnera.

1voto

Marcus Griep Points 3010

Les classes de la bibliothèque de collections génériques C5 prennent toutes en charge la méthode AddRange . C5 a une interface beaucoup plus robuste qui expose en réalité toutes les fonctionnalités de ses implémentations sous-jacentes et est compatible avec les interfaces System.Collections.Generic ICollection et IList , ce qui signifie les collections de C5 peuvent facilement être remplacées par la mise en œuvre sous-jacente.

0voto

Vous pouvez ajouter votre plage IEnumerable à une liste, puis définir ICollection = sur la liste.

         IEnumerable<T> source;

        List<item> list = new List<item>();
        list.AddRange(source);

        ICollection<item> destination = list;
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X