2009-04-08 10 views
12

tengo un método en una aplicación de Silverlight que actualmente devuelve un IList y me gustaría encontrar la manera más limpia de convertir esto en una manera ObservableCollection:IList <T> a ObservableCollection <T>

public IList<SomeType> GetIlist() 
{ 
    //Process some stuff and return an IList<SomeType>; 
} 

public void ConsumeIlist() 
{ 
    //SomeCollection is defined in the class as an ObservableCollection 

    //Option 1 
    //Doesn't work - SomeCollection is NULL 
    SomeCollection = GetIlist() as ObservableCollection 

    //Option 2 
    //Works, but feels less clean than a variation of the above 
    IList<SomeType> myList = GetIlist 
    foreach (SomeType currentItem in myList) 
    { 
     SomeCollection.Add(currentEntry); 
    } 
} 

ObservableCollection no tiene un constructor que tomará un IList o IEnumerable como parámetro, así que no puedo crear uno nuevo. ¿Hay una alternativa que se parece más a la opción 1 que me falta, o estoy siendo demasiado selectivo aquí y la opción 2 realmente es una opción razonable.

Además, si la opción 2 es la única opción real, ¿hay alguna razón para usar un IList sobre un IEnurerable si todo lo que realmente voy a hacer con él es iterar sobre el valor de retorno y agregarlo a algún otro tipo de colección?

Gracias de antemano

+2

actualización para Silverlight 4: ObservableCollection hace ahora tiene un constructor que t ake un IList o IEnumerable como un parámetro –

Respuesta

28

Se puede escribir un método de extensión rápida y sucia para hacer más fácil

public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> enumerable) { 
    var col = new ObservableCollection<T>(); 
    foreach (var cur in enumerable) { 
    col.Add(cur); 
    } 
    return col; 
} 

Ahora sólo puede escribir

return GetIlist().ToObservableCollection(); 
+2

lo había considerado, y probablemente debería haberlo dicho. Sobre todo, quiero asegurarme de que no haya algo en lo que me haya perdido. –

+1

@Steve, lamentablemente, no creo que haya pasado por alto nada. – JaredPar

+1

Jared, corrección menor en su sintaxis - público estático ObservableCollection ToObservableCollection (esto ... debe ser público estático ObservableCollection ToObservableCollection (esto ... No tengo suficiente representante para editar su publicación. Arregle la precisión. Gracias –

20

Er ...

ObservableCollectionhace tiene un constructor que tomará un IEnumerable<T>, y IList<T> deriva de IEnumerable<T>.

para que pueda "acaba de nuevo hacia arriba"

+0

La documentación parece ser incorrecta. He verificado esto con reflector.exe – JaredPar

+0

¿Es esa quizás la versión WPF de ObservableCollection? Estoy trabajando en Silverlight. Edición para incluir eso en el TEXTO y no solo en la etiqueta. –

+0

@JaredPar: ¿Está diciendo que utilizó el reflector para verificar que la versión de Silverlight tiene un constructor de IEnumerable? – Randolpho

1
 IList<string> list = new List<string>(); 

     ObservableCollection<string> observable = 
      new ObservableCollection<string>(list.AsEnumerable<string>()); 
+0

La versión Silverlight de ObservableCollection solo tiene el constructor predeterminado. No se puede subir uno nuevo y pasarlo para inicializarlo. –

+0

+1 Más fácil que agregar una estática para convertir. –

2

El método de extensión que JaredPar ha dado es su mejor opción en Silverlight. Le da la capacidad de convertir cualquier IEnumerable en una colección observable de forma automática simplemente haciendo referencia al espacio de nombre y reduce la duplicación de código. No hay nada incorporado, a diferencia de WPF, que ofrece la opción de constructor.

ib.

2

no reabrir el hilo, pero un constructor para ObservableCollection que lleva IEnumerable se ha añadido a Silverlight 4

2

Silverlight 4 no tienen la capacidad de simplemente 'new up' an ObservableCollection

Aquí está el método de extensión más corta posible en Silverlight 4.

public static class CollectionUtils 
{ 
    public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> items) 
    { 
     return new ObservableCollection<T>(items); 
    } 
} 
1
Dim taskList As ObservableCollection(Of v2_Customer) = New ObservableCollection(Of v2_Customer) 
' Dim custID As Guid = (CType(V2_CustomerDataGrid.SelectedItem, _ 
'   v2_Customer)).Cust_UUID 
' Generate some task data and add it to the task list. 
For index = 1 To 14 
    taskList.Add(New v2_Customer() With _ 
       {.Cust_UUID = custID, .Company_UUID, .City 
       }) 
Next 

Dim taskListView As New PagedCollectionView(taskList) 
Me.CustomerDataForm1.ItemsSource = taskListView 
Cuestiones relacionadas