我正在使用Directory.EnumerateFiles
列出两个单独目录中的文件。两个文件夹中都存在一些文件。如何从组合列表中删除任何重复文件?
try
{
corporateFiles = Directory.EnumerateFiles(@"\\" + corporateServer, "*.pdf", SearchOption.AllDirectories).ToList();
}
catch
{
corporateFiles = new List<string>();
}
try {
functionalFiles = Directory.EnumerateFiles(@"\\" + functionalServer, "*.pdf", SearchOption.AllDirectories).ToList();
}
catch
{
functionalFiles = new List<String>();
}
var combinedFiles = corporateFiles.Concat(functionalFiles);
答案 0 :(得分:1)
使用Union
代替Concat
:
var combinedFiles = corporateFiles.Union(functionalFiles);
您可以使用传递IEqualityComparer<string>
的重载来仅使用名称部分进行比较:
var combined = corporateFiles.Union(functionalFiles, new FileNameComparer())
class FileNameComparer : EqualityComparer<string>
{
public override bool Equals(string x, string y)
{
var name1 = Path.GetFileName(x);
var name2 = Path.GetFileName(y);
return name1 == name2;
}
public override int GetHashCode(string obj)
{
var name = Path.GetFileName(obj);
return name.GetHashCode();
}
}
答案 1 :(得分:1)
似乎我不能满足我对LINQ的渴望。
这是一个单行:
var combinedFiles = corporateFiles.Concat(functionalFiles.Where(x => !(corporateFiles.Select(y => y.Split('\\').Last()).ToList().Intersect(functionalFiles.Select(y => y.Split('\\').Last()))).Contains(x.Split('\\').Last())));
这使文件路径保持corporateFiles
。如果您愿意,可以更换它们。
我会尝试将其格式化为更具可读性。
编辑:这里的代码抽象了一点,希望更具可读性:
// Get common file names:
var duplicateFileNames = corporateFiles.Select(y => y.Split('\\').Last()).ToList().Intersect(functionalFiles.Select(y => y.Split('\\').Last()));
// Remove entries in 'functionalFiles' that are duplicates:
var functionalFilesWithoutDuplicates = functionalFiles.Where(x => !duplicateFileNames.Contains(x.Split('\\').Last()));
// Combine the un-touched 'corporateFiles' with the filtered 'functionalFiles':
var combinedFiles = corporateFiles.Concat(functionalFilesWithoutDuplicates);