70 votes

Transférer le résultat LINQ vers ObservableCollection

Le fait qu'il s'agisse d'un résultat LINQ n'est peut-être pas pertinent pour la question, mais je le mentionne quand même - puisque c'est le contexte qui a donné lieu à cette question.

Je lance une requête LINQ. Le résultat est un ;

IEnumerable<MyClass> 

Je veux placer le résultat dans une ObservableCollection ;

ObservableCollection<MyClass> 

Comment faire ce casting ? (sans passer par l'IEnumerable et copier les éléments dans l'ObservableCollection). Je remarque que LINQ a quelques fonctions To..(), mais cela ne semble pas m'aider pour ce cast ?

0 votes

Cela répond-il à votre question ? Comment convertir IEnumerable en ObservableCollection ?

114voto

Jon Skeet Points 692016

Il suffit d'utiliser :

ObservableCollection<Foo> x = new ObservableCollection<Foo>(enumerable);

Cela fera la copie nécessaire. Il n'y a aucun moyen d'observer les changements apportés à la requête en direct - bien que l'idée d'un système de gestion de la qualité de l'information (SGI) ait été retenue. ObservableQuery<T> est intéressante (bien que difficile).

Si vous voulez une méthode d'extension pour faire cela, c'est simple :

public static ObservableCollection<T> ToObservableCollection<T>
    (this IEnumerable<T> source)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }
    return new ObservableCollection<T>(source);
}

4 votes

Quelqu'un sait-il comment réaliser cela dans Silverlight 3.0, où seul le constructeur par défaut new ObservableCollection<Foo>() est disponible ?

1 votes

Malheureusement, cela ne sert pas à grand-chose si vous voulez copier les résultats dans une ObservableCollection qui est déjà enveloppée par une ReadOnlyObservableCollection, car la ReadOnlyObservableCollection ne peut pas être rebondie vers une nouvelle collection. Dans ce cas, il semble que vous soyez obligé d'utiliser une boucle foreach et de copier les éléments un par un.

0 votes

@Neutrino : Je dirais que c'est un problème différent de celui présenté dans la question. C'est un problème valable, mais je ne pense pas que ce soit celui du PO.

16voto

Dave Markle Points 44637
var linqResults = foos.Where(f => f.Name == "Widget");

var observable = new ObservableCollection<Foo>(linqResults);

11voto

bruno conde Points 28120

Vous pouvez utiliser un ObservableCollection Constructeur pour ça :

ObservableCollection<MyClass> obsCol = 
        new ObservableCollection<MyClass>(myIEnumerable);

0voto

Heiko Hatzfeld Points 2931

IEnumerable est seulement l'interface.

Vous devez copier le contenu de l'IEnumerable dans l'ObservableCollection. Vous pouvez le faire en passant votre IEnumerable dans le constructeur de l'ObservableCollection lorsque vous en créez une nouvelle.

-2voto

Oladipo Olasemo Points 89

Var q = t.Where(o => o.name == strName}) as ObservableCollection ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X