2009-10-14 22 views
8

Mam dwie listy ObservableCollection, które chcę zjednoczyć. Moje naiwne podejście było użyć Union - metoda:Unia dwie obserwowalne listy kolekcji

ObservableCollection<Point> unitedPoints = observableCollection1.Union(observableCollection2); 

ObservableCollection1/2 są typu ObservableCollection też. Ale kompilator wyrzuca następujący błąd na tej linii:

typu „System.Collections.Generic.IEnumerable” nie może być przekształcony do niejawny „System.Collections.ObjectModel.ObservableCollection”. Wyraźne przekształcenie już istnieje. (Może brak konwersji)

(sformułowanie może nie być dokładne, co przetłumaczyłem z języka niemieckiego).

Ktoś wie, jak scalić ObserveableCollections i uzyskać ObservableCollection jako wynik?

Dzięki z góry, Frank

Edith mówi: Właśnie sobie sprawę, że ważne jest, aby wspomnieć, że opracowanie Silverlight-3-application, ponieważ klasa "ObservableCollection" różnią się SL3 i .NET3.0 scenariusze.

Odpowiedz

10

Metoda rozszerzenia LINQ Union zwraca wartość IEnumerable. trzeba będzie wyliczyć i dodać każdy element do zbierania wyników: -

var unitedPoints = new ObservableCollection<Point>(); 
foreach (var p in observableCollection1.Union(observableCollection2)) 
    unitedPoints.Add(p); 

Jeśli chcesz się ToObservableCollection następnie można zrobić:

public static class MyEnumerable 
{ 
    public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> source) 
    { 
     var result = new ObservableCollection<T>(); 
     foreach (var item in source) 
      result.Add(item); 
     return result; 
    } 
} 

Teraz linia jest:

var unitedPoints = observableCollection1.Union(observableCollection2).ToObservableCollection(); 
+0

dobra odpowiedź - ale czy miałeś na myśli foreach, a nie "za"? – kiwipom

+0

YAP, to foreach – Aaginor

+0

ooops, tak foreach, flicking między javascript i C# zrobi to tobie – AnthonyWJones

8

Czy chcesz scalić istniejącą zawartość, ale czy zasadniczo masz niezależne listy? Jeśli tak, to jest stosunkowo proste:

ObservableCollection<Point> unitedPoints = new ObservableCollection<Point> 
    (observableCollection1.Union(observableCollection2).ToList()); 

Jednakże, jeśli chcesz jedną kolekcję zaobserwowania który jest faktycznie „widok” na innych, nie jestem pewien, że najlepszym sposobem, aby to zrobić ...

+0

Próbowałem już to, ale Konstruktor ObservableCollection nie miał przeciążenia, które akceptują parametr ... i wtedy zdałem sobie sprawę, że ObservableCollection w Silverlight jest inny niż OberservableCollection w .NET 3.0. CO? Myślałem, że mogę używać tych samych klas z aplikacji na komputery w Silverlight? Jak to działa, skoro nawet takie podstawowe klasy różnią się w obu scenariuszach? W JAKI SPOSÓB mogą myśleć o nadaniu RÓŻNYM klasom nazwy SAME? To jest absolutnie dziwne. Co jeszcze działa * trochę * inaczej niż ... – Aaginor

+0

Czy jesteś pewien, że są to rzeczywiście różne klasy? Czy po prostu w wersji Silverlight brakuje niektórych metod/konstruktorów? –

+0

@aaginor: implementacje Silverlight wielu rzeczy, które mają ze standardowymi bibliotekami .NET są często znacznie uproszczone. To dość irytujące, gdy trzeba sprawdzić swoje dokumenty na nowo, gdy używamy czegoś, co już znamy. Jest to szczególnie irytujące, że dokumenty SL3 są nadal tylko w formie chm (lub online) :( – AnthonyWJones