web-dev-qa-db-ja.com

LINQの結果をObservableCollectionにキャストします

それがLINQの結果であるという事実は、おそらく質問に関連しないかもしれませんが、とにかく言及しています-これはこの質問をもたらしたコンテキストであるためです。

LINQクエリを実行します。結果は次のとおりです。

IEnumerable<MyClass> 

結果をObservableCollectionに入れたい。

ObservableCollection<MyClass> 

このキャストを行うにはどうすればよいですか? (IEnumerableを実行せず、要素をObservableCollectionにコピーせずに)。 LINQにはTo ..()関数がいくつかありますが、このキャストには役に立たないようです。

59
stiank81

ただ使用する:

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

これにより、必要なコピーが実行されます。ライブクエリの変更を観察する方法はありません-ObservableQuery<T>は興味深い(挑戦的ではあるが)ものです。

これを行う拡張メソッドが必要な場合、それは簡単です。

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

これには、ObservableCollectionconstructor を使用できます。

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

私は数年前にこのライブラリを書きました。

https://github.com/wasabii/OLinq

おそらくあなたが望んでいることを正確に行うわけではなく、それ以上のことをします。これは、式ツリーを解析し、参照されるコレクションにアタッチし、変更時にイベントを発行する別のコレクションを公開するLinqクエリプロバイダーです。

いくつかのLinq演算子がありません。しかし、コードベースを拡張するのは難しくありません。

0
wasabi

IEnumerableはインターフェイスのみです。

IEnumerableからObservableCollectionにコンテンツをコピーする必要があります。これを行うには、新しいものを作成するときに、IEnumerableをObersvableCollectionのコンストラクターに渡します。

0
Heiko Hatzfeld