如何从IEnumerable <directoryinfo> </directoryinfo>中排除目录

时间:2012-02-08 18:29:04

标签: c# linq linq-to-objects

我知道为什么当“excl”列表包含多个字符串时,以下代码不起作用。这是因为当在lambda中评估每个字符串时,它现在包括在前一次迭代“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 个答案:

答案 0 :(得分:3)

你想要做的是这个(嵌套迭代):

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

答案 1 :(得分: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>并使用它。