2011-07-08 7 views
1

ObservableCollection<Object>には、DirectoryFileの2種類のオブジェクトがあります。このコレクションはコントロールにバインドされており、しばらくしてFileを除外したいと考えています。フィルターオブジェクトObservableCollection 何らかのタイプ

私が働いていない次のコードを、持っている:

var files = (from File f in (from Directory d in selectedDirs 
          select d.Childs) 
      where f is File 
      select f); 

を、私はこのエラーを取得しています:

Unable to cast object of type 'System.Collections.ObjectModel.ObservableCollection`1[System.Object]' to type 'CMBraga_FileExplorer.File'.

はどうやって値を得ることができますか?私は彼らがFileであることを知っています。

// this was ran without explicit conversion (just as an example) 

? myCollection 
Count = 5 
    [0]: {CMBraga_FileExplorer.File} 
    [1]: {CMBraga_FileExplorer.File} 
    [2]: {CMBraga_FileExplorer.File} 
    [3]: {CMBraga_FileExplorer.File} 
    [4]: {CMBraga_FileExplorer.File} 

答えて

2

私はあなたのクエリ変数(すなわち、​​)の種類を宣言しているので、あなたが例外を取得している理由があると思います。これを行うことで、オブジェクトを指定された型にキャストしようとしています。 d.Childsの商品の一部がObservableCollection<Object>であるようです。それらは明らかにFileオブジェクトではないので、キャストエラーです。

ここでは、Enumerable.OfType()拡張メソッドを使用してフィルタ処理を行います。これはまさにそれが作られたものです。

var files = selectedDirs 
    .Cast<Directory>() // this cast might not even be necessary 
    .SelectMany(d => d.Childs) 
    .OfType<File>(); // filter selecting only File objects 
1

あなたはそのためのLINQ式を使用することができます。

using System.Linq; 
// ... 
ObservableCollection<object> list; 
// ... 
IEnumerable<CMBraga_FileExplorer.File> castedList = list.Cast<CMBraga_FileExplorer.File>(); 
+0

これはうまくいった!大変ありがとうございます! –

関連する問題