我知道为什么当“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();
答案 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>
并使用它。