考虑具有以下内容的c#List<string> files
C:\z1\z1.docx
C:\z1\z2.docx
C:\z2\z2.docx // <--- file z2.docx has the same name as in folder z1.
我现在想要查找具有相同文件名的所有文件,并收到包含完整路径+文件名
的列表 List<string> duplicates
C:\z1\z2.docx
C:\z2\z2.docx
我问,因为使用循环和其他无效的方法编写解决方案很容易,但我想使用一个优雅的解决方案,而我在c#中的List-operations知识是不够的。
答案 0 :(得分:4)
我不确定你的东西循环会效率低下 - 这就是LINQ无论如何都要做的事情。但是如果你想使用LINQ,你可以使用几个方法调用来实现:
var result = files.GroupBy(p => Path.GetFileName(p))
.Where(g => g.Count() > 1)
.SelectMany(g => g);
它将首先按文件名分组,丢弃仅包含1个元素的所有组,并将剩余的组展平为单个路径集合。
您可以在ToList
之后添加SelectMany
来电,将结果具体化为List<string>
。
答案 1 :(得分:2)
List<string> duplicates = new List<string>() { @"C:\z1\z1.docx",
@"C:\z1\z2.docx", @"C:\z2\z2.docx" };
List<dynamic> GetList(List<string> FilesToCheck)
{
var Files = from file in FilesToCheck
where duplicates.Contains(file)
select new { FileName = new FileInfo(file).Name, FullName
= new FileInfo(file).FullName };
return Files.ToList();
}