2010-02-02 14 views
19

J'ai un ObservableCollection, et je voudrais définir le contenu d'un IList à celui-ci. Maintenant, je pouvais créer une nouvelle instance de la collection ..:Ajouter des éléments de IList à ObservableCollection

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

Mais comment puis-je réellement le contenu du IList et l'ajouter à mon ObservableCollection existant? Dois-je faire une boucle sur tous les éléments, ou y a-t-il un meilleur moyen?

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

Répondre

39

Vous pouvez 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); 
    }  
+0

Thx! Je suis allé avec l'approche ToList.ForEach pour le moment. Considérera la méthode d'extension si j'en ai besoin de plus d'un endroit. – stiank81

+0

La méthode d'extension 'Enumerable.ToList' alloue inutilement une nouvelle' Liste '. Je recommanderais probablement la réponse de RaYell. –

+3

@Richard - c'est vrai bien que sous le capot cela fait une nouvelle liste (liste) - qui appelle en interne ((ICollection ) liste) .CopyTo (T []) qui dans la plupart des implémentations de IList (par exemple Liste ) appelle une fonction de copie de tableau native (externe). ceci devrait être très efficace et impliquer seulement (au plus) une copie atomique des références nécessaires plutôt que l'itération des membres. –

1

Looping est la seule façon, car il n'y a pas d'équivalent pour AddRangeObservableCollection.

8

Vous pouvez écrire votre propre méthode d'extension si vous utilisez C# 3 + pour vous aider. Ce code a eu quelques tests de base pour faire en sorte que cela fonctionne:

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

+1 pour l'idée de méthode d'extension –

+1

Le projet Microsoft [Prism] (http://compositewpf.codeplex.com/) pour WPF inclut une méthode d'extension similaire (bien que leur version renvoie la collection, plutôt que "void", pour supporter le chaînage des méthodes). Référencez simplement Microsoft.Practices.Composite.dll et ajoutez 'using Microsoft.Practices.Composite;'. – totorocat