2009-04-08 25 views
12

Ich habe eine Methode in einer Silverlight-Anwendung, die derzeit eine IList zurück, und ich möchte die sauberste Weg finden, diese in ein ObservableCollection zu drehen, so:IList <T> 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 nicht hat Ein Konstruktor, der eine IList oder IEnumerable als Parameter verwendet, damit ich nicht einfach eine neue erstellen kann. Gibt es eine Alternative, die eher wie Option 1 aussieht, die ich vermisse, oder bin ich einfach zu pingelig hier und Option 2 ist wirklich eine vernünftige Option.

Wenn Option 2 die einzige echte Option ist, gibt es einen Grund, einen IList über IEurerable zu verwenden, wenn alles, was ich jemals damit tun werde, über den Rückgabewert iteriert und zu einem anderen hinzugefügt wird Art der Sammlung?

Vielen Dank im Voraus

+2

Update für Silverlight 4: ObservableCollection nun einen Konstruktor hat, dass t wird ake ein IList oder IEnumerable als Parameter –

Antwort

28

Sie könnten eine schnelle und schmutzige Erweiterungsmethode schreiben, um es einfach

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; 
} 

Jetzt können Sie nur

return GetIlist().ToObservableCollection(); 
+2

Ich hatte dies in Betracht gezogen, und sollte es wahrscheinlich auch gesagt haben. Meistens möchte ich sicher sein, dass da nichts ist, was ich vermisst habe. –

+1

@Steve leider glaube ich nicht, dass du irgendetwas übersehen hast. – JaredPar

+1

Jared, geringfügige Korrektur für Ihre Syntax - public static ObservableCollection ToObservableCollection (das ... sollte öffentlich sein statisch ObservableCollection ToObservableCollection (dies ... Ich habe nicht genug rep, um Ihren Beitrag zu bearbeiten. Bitte beheben für Genauigkeit. Danke –

20

Er schreiben ...

ObservableCollectiontut haben eine constructor, die eine IEnumerable<T> nimmt, und IList<T> leitet sich von IEnumerable<T> ab.

So kann man „nur neue up“

+0

Die Dokumentation scheint nicht korrekt zu sein. Ich habe dies mit reflector.exe überprüft – JaredPar

+0

Ist das vielleicht die WPF-Version von ObservableCollection? Ich arbeite in Silverlight. Bearbeiten, um das in TEXT und nicht nur das Tag aufzunehmen. –

+0

@JaredPar: Sagen Sie, dass Sie Reflector verwendet haben, um zu überprüfen, ob die Silverlight-Version einen IEnumerable-Konstruktor hat? – Randolpho

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

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

Die Silverlight-Version von ObservableCollection hat nur den Standardkonstruktor. Kann nicht neu und übergibt es nichts, um es zu initialisieren. –

+0

+1 Einfacher als das Hinzufügen einer statischen Konvertierung. –

2

Die Erweiterung Methode, die JaredPar hat Ihnen die beste Wahl in Silverlight ist. Sie haben die Möglichkeit, beliebige IEnumerable automatisch in eine beobachtbare Sammlung umzuwandeln, indem Sie einfach auf den Namespace verweisen und die Codeverdopplung reduzieren. Im Gegensatz zu WPF, das die Konstruktoroption bietet, ist nichts eingebaut.

ib.

2

nicht den Faden aber einen Konstruktor für ObservableCollection zu öffnen, die IEnumerable wurde hinzugefügt, um zu Silverlight 4

2

Silverlight 4 die Möglichkeit, nur 4 'new up' an ObservableCollection

Hier ist die verkürzte Erweiterungsmethode möglich in Silverlight hat nimmt.

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 
Verwandte Themen