それがLINQの結果であるという事実は、おそらく質問に関連しないかもしれませんが、とにかく言及しています-これはこの質問をもたらしたコンテキストであるためです。
LINQクエリを実行します。結果は次のとおりです。
IEnumerable<MyClass>
結果をObservableCollectionに入れたい。
ObservableCollection<MyClass>
このキャストを行うにはどうすればよいですか? (IEnumerableを実行せず、要素をObservableCollectionにコピーせずに)。 LINQにはTo ..()関数がいくつかありますが、このキャストには役に立たないようです。
ただ使用する:
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);
}
var linqResults = foos.Where(f => f.Name == "Widget");
var observable = new ObservableCollection<Foo>(linqResults);
これには、ObservableCollection
constructor を使用できます。
ObservableCollection<MyClass> obsCol =
new ObservableCollection<MyClass>(myIEnumerable);
私は数年前にこのライブラリを書きました。
https://github.com/wasabii/OLinq
おそらくあなたが望んでいることを正確に行うわけではなく、それ以上のことをします。これは、式ツリーを解析し、参照されるコレクションにアタッチし、変更時にイベントを発行する別のコレクションを公開するLinqクエリプロバイダーです。
いくつかのLinq演算子がありません。しかし、コードベースを拡張するのは難しくありません。
IEnumerableはインターフェイスのみです。
IEnumerableからObservableCollectionにコンテンツをコピーする必要があります。これを行うには、新しいものを作成するときに、IEnumerableをObersvableCollectionのコンストラクターに渡します。