我有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
。
// 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}
答案 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>();