基于c#中List <string>中的子字符串匹配生成新的List <string>

时间:2016-12-31 13:11:19

标签: c# list substring

考虑具有以下内容的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知识是不够的。

2 个答案:

答案 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();
        }