2010-02-02 34 views
19

Tengo un ObservableCollection, y me gustaría establecer el contenido de un IList a este. Ahora sólo podía crear una nueva instancia de la colección ..:Agregar elementos de IList a ObservableCollection

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

Pero cómo puedo tomar realmente el contenido de la IList y añadirlo a mi ObservableCollection existente? ¿Tengo que recorrer todos los elementos, o hay una mejor manera?

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

Respuesta

39

Usted podría hacer

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

o como un método de extensión,

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

¡Thx! Fui con el enfoque ToList.ForEach por ahora. Considere el método de extensión si necesito más de un lugar. – stiank81

+0

El método de extensión 'Enumerable.ToList' asigna innecesariamente una nueva' Lista '. Probablemente recomendaría la respuesta de RaYell. –

+3

@Richard - que es cierto aunque bajo el capó esta nueva lista hace (lista) - que llama internamente (lista (ICollection )) .CopyTo (T []) que en la mayoría de las implementaciones de IList (por ejemplo, lista de llamadas ) una función de copia de matriz nativa (externa). esto debería ser bastante eficiente y solo implicaría (como máximo) una copia atómica de las referencias necesarias en lugar de la iteración de los miembros. –

1

bucle es la única manera, ya que no hay equivalente para AddRangeObservableCollection.

8

Puedes escribir tu propio método de extensión si estás usando C# 3 + para ayudarte con eso. Este código ha tenido algunas pruebas básicas para asegurarse de que funciona:

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

+1 para la idea de método de extensión –

+1

El proyecto de Microsoft [Prism] (http://compositewpf.codeplex.com/) para WPF incluye un método de extensión similar (aunque su versión devuelve la colección, en lugar de 'void', para apoyar el encadenamiento de métodos). Simplemente haga referencia a Microsoft.Practices.Composite.dll y agregue 'using Microsoft.Practices.Composite;'. – totorocat

Cuestiones relacionadas