Как преобразовать DirectoryInfo.EnumerateDirectories в Список <DirectoryInfo> - PullRequest
0 голосов
/ 12 апреля 2020

Этот вопрос связан с моим предыдущим постом . В этом случае вместо получения полных имен каталогов я пытаюсь создать переменную типа List<DirectoryInfo>.

. Этот код не совсем работает

DirectoryInfo dirInfo = new DirectoryInfo(path);
List<DirectoryInfo> dirList = dirInfo.EnumerateDirectories("*.", SearchOption.AllDirectories);          

throws ошибка:

Невозможно неявно преобразовать тип 'System.Collections.Generi c .IEnumerable' в 'System.Collections.Generi c .List'

И эта версия:

List<DirectoryInfo> dirList = dirInfo.EnumerateDirectories<DirectoryInfo>("*.", SearchOption.AllDirectories);     

выдает эту ошибку:

Не универсальный c метод 'DirectoryInfo.EnumerateDirectories ()' нельзя использовать с аргументами типа.

Будем благодарны за любые предложения или советы.

Ответы [ 2 ]

3 голосов
/ 12 апреля 2020

EnumerateDirectories() возвращает IEnumerable<DirectoryInfo> вместо List<DirectoryInfo>. Они бывают разных типов.

Вы могли бы просто поставить ToList() в конце:

DirectoryInfo dirInfo = new DirectoryInfo(path);
List<DirectoryInfo> dirList = dirInfo.EnumerateDirectories("*.", SearchOption.AllDirectories).ToList();  

Но это наивный вариант . Это часто не так хорошо для производительности. Есть причина, по которой IEnumerable<DirectoryInfo> был выбран вместо этого. У этого есть некоторые хорошие преимущества с точки зрения использования памяти и операции "точно в срок / ленивый".

Так что лучшее исправление , вероятно, заменяет имя типа в начале строки на var:

DirectoryInfo dirInfo = new DirectoryInfo(path);
var dirList = dirInfo.EnumerateDirectories("*.", SearchOption.AllDirectories);
1 голос
/ 12 апреля 2020

Это потому, что метод EnumerateDirectories возвращает тип IEnumerable<DirectoryInfo>, тогда как ожидаемый тип - List<DirectoryInfo>, поэтому вам нужно привести IEnumerable к List с добавлением ToList() следующим образом:

List<DirectoryInfo> dirList = dirInfo.EnumerateDirectories<DirectoryInfo>("*.", SearchOption.AllDirectories).ToList();   
...