2012-02-08 1 views
2

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

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

Что-то, как это должно работать:

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> из своего списка исключений и использовать его.

+0

Похоже, Крис Шайн бить вас на минуту. Я изучал документацию Intersect <> и читал хэш-коды, но я знал, что для этой проблемы будет однострочное решение. Этот код предназначен только для частичного соответствия пути к каталогу, а не для точного соответствия. – user1197862

+0

Я избил его на минутку, но все в порядке ;-) – BrokenGlass

+0

Вы правы, я шел первым, показывая его. Это был мой первый вопрос здесь, не понимал, что он показывает ответы, самые новые до самых старых, хотя они четко пронумерованы! Я переключу ответы. – user1197862

3

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

dirs = dirs.Where(d => !excl.Any(x => d.FullName.ToLowerInvariant().Contains(x.ToLowerInvariant()))) 
    .Distinct().ToArray(); 
+0

Работал как шарм. Благодаря! – user1197862

+0

Жаль, что я дал вам ответ, но не понял, что вы пришли через минуту. – user1197862

+0

Нет пота - ни @BrokenGlass, ни я не переживу слишком много за 15 очков :-) –

Смежные вопросы