2009-10-14 5 views
8

J'ai deux listes ObservableCollection, que je veux réunir. Mon approche naïve était d'utiliser l'Union - Méthode:Union deux Listes ObservableCollection

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

ObservableCollection1/2 sont de type ObservableCollection aussi. Mais le compilateur jette l'erreur suivante pour cette ligne:

type « System.Collections.Generic.IEnumerable » ne peut pas être converti implicite « System.Collections.ObjectModel.ObservableCollection ». Une conversion explicite existe déjà. (Peut-être qu'une conversion est manquante)

(la formulation peut ne pas être exacte, comme je l'ai traduit de l'allemand). Tout le monde sait comment fusionner les deux ObservableCollections et obtenir un ObservableCollection comme résultat?

Merci à l'avance, Frank

Edith dit: Je viens de réaliser qu'il est important de mentionner que je développe un Silverlight-3-application, parce que la classe "ObservableCollection" diffèrent dans SL3 et .NET3.0 scénarios.

Répondre

10

La méthode d'extension LINQ Union renvoie un IEnumerable. Vous aurez besoin d'énumérer et d'ajouter chaque élément à la collection de résultat: -

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

Si vous souhaitez un ToObservableCollection alors vous pouvez faire:

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

Maintenant, votre ligne est:

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

belle réponse - mais voulez-vous dire foreach, pas 'pour'? – kiwipom

+0

yap, c'est foreach – Aaginor

+0

ooops, oui foreach, fliting entre javascript et C# va vous le faire – AnthonyWJones

8

Voulez-vous fusionner le contenu existant, mais vous avez essentiellement des listes indépendantes? Si oui, c'est relativement facile:

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

Cependant, si vous voulez une collection observable qui est effectivement une « vue » sur les autres, je ne suis pas sûr de la meilleure façon de le faire ...

+0

Je l'ai déjà essayé, mais le constructeur de ObservableCollection n'avait pas de surcharges acceptant un paramètre ... et j'ai alors réalisé que ObservableCollection dans Silverlight est différent de OberservableCollection dans .NET 3.0. QUELLE? Je pensais pouvoir utiliser les mêmes classes à partir des applications Desktop dans Silverlight? Comment cela devrait-il fonctionner, alors que même ces classes de base diffèrent dans les deux scénarios? Comment peuvent-ils même penser à donner le même nom aux classes DIFFÉRENTES? C'est absolument bizarre. Quoi d'autre fonctionne * un peu * différent alors ... – Aaginor

+0

Etes-vous sûr qu'ils sont en fait des classes différentes? Ou est-ce juste que la version Silverlight manque des méthodes/constructeurs? –

+0

@aaginor: Les implémentations Silverlight de beaucoup de choses qu'elles ont en commun avec les bibliothèques .NET sont souvent considérablement simplifiées. C'est assez énervant d'avoir à revoir leurs documents quand on utilise quelque chose que nous connaissons déjà. Il est particulièrement irritant que les docs de SL3 soient encore seulement en forme chm (ou en ligne) :( – AnthonyWJones