Объект фильтра ObservableCollection <Object>некоторого типа - PullRequest
2 голосов
/ 08 июля 2011

У меня есть 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);

Iполучаю эту ошибку:

Невозможно привести объект типа '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 ]

2 голосов
/ 08 июля 2011

Я подозреваю, что причина, по которой вы получаете исключение, заключается в том, что вы объявляете типы переменной запроса (т. Е. 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 голос
/ 08 июля 2011

Вы можете использовать выражение Linq для этого:

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