web-dev-qa-db-fra.com

Cast 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 abouti à cette question.

J'exécute une requête LINQ. Le résultat est un;

IEnumerable<MyClass> 

Je veux mettre le résultat dans une ObservableCollection;

ObservableCollection<MyClass> 

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

59
stiank81

Utilisez simplement:

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

Cela fera la copie requise. Il n'y a aucun moyen d'observer les modifications apportées à la requête en direct - bien que l'idée d'un ObservableQuery<T> est intéressant (mais difficile).

Si vous voulez qu'une méthode d'extension le fasse, 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);
}
97
Jon Skeet
var linqResults = foos.Where(f => f.Name == "Widget");

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

Vous pouvez utiliser un ObservableCollectionconstructeur pour cela:

ObservableCollection<MyClass> obsCol = 
        new ObservableCollection<MyClass>(myIEnumerable);
10
bruno conde

J'ai écrit cette bibliothèque il y a quelques années.

https://github.com/wasabii/OLinq

Il ne fait pas exactement ce que vous voulez probablement, il en fait plus. Il s'agit d'un fournisseur de requêtes Linq qui analyse l'arborescence des expressions, s'attache aux collections référencées et expose une autre collection qui émet des événements lors des modifications.

Il manque quelques opérateurs Linq. Mais la base de code n'est pas difficile à étendre.

0
wasabi

IEnumerable n'est que l'interface.

Vous devez copier le contenu de IEnumerable dans ObservableCollection. Vous pouvez le faire en passant votre IEnumerable dans le constructeur de ObersvableCollection lorsque vous en créez un nouveau

0
Heiko Hatzfeld