web-dev-qa-db-fra.com

Ajouter des éléments d'IList à ObservableCollection

J'ai une ObservableCollection et j'aimerais définir le contenu d'un IList à celui-ci. Maintenant, je pourrais juste créer une nouvelle instance de la collection ..:

public ObservableCollection<Bar> obs = new ObservableCollection<Bar>(); 
public void Foo(IList<Bar> list)
{
    obs = new ObservableCollection<Bar>(list); 
}

Mais comment puis-je réellement prendre le contenu de IList et l'ajouter à mon ObservableCollection existant? Dois-je parcourir tous les éléments ou existe-t-il un meilleur moyen?

public void Foo(IList<Bar> list)
{
   foreach (var Elm in list)
       obs.Add(Elm); 
}
22
stiank81

Vous pourriez faire

public void Foo(IList<Bar> list)
{
    list.ToList().ForEach(obs.Add);
}

ou comme méthode d'extension,

    public static void AddRange<T>(this ObservableCollection<T> collection, IEnumerable<T> items)
    {
        items.ToList().ForEach(collection.Add);
    }    
47
Adam Ralph

Vous pouvez écrire votre propre méthode d'extension si vous utilisez C # 3 + pour vous aider. Ce code a subi des tests de base pour s’assurer de son bon fonctionnement:

public static void AddRange<T>(this ObservableCollection<T> coll, IEnumerable<T> items)
{
    foreach (var item in items)
    {
        coll.Add(item);
    }
}
9
RaYell

La mise en boucle est la seule solution car il n'y a pas d'équivalent AddRange pour ObservableCollection.

1
Richard Szalay

Voici un descendant de ObservableCollection<T> pour ajouter un message efficace AddRange, plus des tests unitaires:

ObservableCollection Ne supporte pas la méthode AddRange, je suis donc averti pour chaque élément ajouté, en plus de ce qui concerne INotifyCollectionChanging?

0
weston