筛选对象ObservableCollection<某种类型的
本文关键字:种类 类型 对象 ObservableCollection 筛选 | 更新日期: 2023-09-27 18:01:27
我有一个ObservableCollection<Object>
,它包含两种不同类型的对象:Directory
和File
。这个集合绑定到一个控件,在某些时候,我想过滤掉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}
我怀疑你得到异常的原因是因为你正在声明查询变量的类型(即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>();