过滤对象ObservableCollection <object>的某种类型</object>

时间:2011-07-08 09:20:31

标签: c# observablecollection

我有ObservableCollection<Object>,其中包含两种不同类型的对象:DirectoryFile。此集合绑定到控件,有时我想过滤掉File s。

我有以下代码,但无效:

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

我收到了这个错误:

  

无法投射类型的对象   'System.Collections.ObjectModel.ObservableCollection`1 [System.Object的]'   输入'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 个答案:

答案 0 :(得分:2)

我怀疑您获得异常的原因是因为您声明了查询变量的类型(即from File f in ...)。通过这样做,您尝试将对象强制转换为指定的类型。您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 :(得分:1)

您可以使用Linq表达式:

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