Как исключить каталоги из IEnumerable <DirectoryInfo> - PullRequest
2 голосов
/ 08 февраля 2012

Я знаю, почему следующий код не работает, если в списке «excl» более одной строки. Это потому, что, поскольку каждая строка оценивается в лямбде, теперь она включает в себя все, что было исключено в предыдущей итерации «x». У меня вопрос, как мне заставить его правильно исключить несколько элементов в конечном результате?

var di = new DirectoryInfo(@"\\192.168.1.10\e$");

var excl = new List<string>();
excl.Add("Temp");
excl.Add("VSS");

var dirs = from d in di.GetDirectories()
           where (d.Attributes & FileAttributes.System) != FileAttributes.System
           select d;                       

dirs = excl
       .SelectMany(x => from d in dirs
       where !d.FullName.ToLowerInvariant().Contains(x.ToLowerInvariant())
       select d)
       .Distinct().ToArray();

Ответы [ 2 ]

3 голосов
/ 08 февраля 2012

То, что вы хотите сделать, это (вложенная итерация):

dirs = dirs.Where(d => !excl.Any(x => d.FullName.ToLowerInvariant().Contains(x.ToLowerInvariant())))
   .Distinct().ToArray();
2 голосов
/ 08 февраля 2012

Примерно так должно работать:

var di = new DirectoryInfo(@"\\192.168.1.10\e$");
var dirs = di.EnumerateDirectories()
             .Where(d=> !excl.Any(e=>d.FullName.ToLowerInvariant().Contains(e)));

Я бы подумал о ваших критериях исключения - хотите ли вы исключить все каталоги, которые содержат вашу строку исключения, или только каталоги, имена которых соответствуют элементу исключения?

Также, чтобы сделать это быстрее, вы можете создать HashSet<string> из списка исключений и использовать его.

...