筛选对象ObservableCollection<某种类型的

本文关键字:种类 类型 对象 ObservableCollection 筛选 | 更新日期: 2023-09-27 18:01:27

我有一个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 s。

// 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}

筛选对象ObservableCollection<某种类型的

我怀疑你得到异常的原因是因为你正在声明查询变量的类型(即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

您可以使用Linq表达式:

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