创建包含相同名称的文档列表

时间:2012-12-07 20:11:25

标签: c# .net

我正在创建一个应该连接包含相同名称的文档的工具。

示例:C_BA_20000_1.pdf和C_BA_20000_2.pdf 这些文件应分组在一个列表中。 该工具在目录上运行,例如

//directory of pdf files
  DirectoryInfo dirInfo = new DirectoryInfo(@"C:\Users\derp\Desktop");

  FileInfo[] fileInfos = dirInfo.GetFiles("*.pdf");

foreach(fileInfos中的FileInfo信息)

我想创建一个包含同名文件名的ArrayList

ArrayList list = new ArrayList();
 list.Add(info.FullName);

然后有一个包含所有类似文档的ArrayLists的列表。

 List<ArrayList> bigList = new List<ArrayList>();

所以我的问题是,如何对包含相同名称的文件进行分组并将它们放在同一个列表中。

修改 文件的名称AB_CDEFG_i具有相同的模式 其中我是一个数字,可以从1-n。具有相同名称的文件最后应该只有不同的编号。

  

AB_CDEFG_1

     

AB_CDEFG_2

     

HI_JKLM_1

输出应为:

列表1:AB_CDEFG_1和AB_CDEFG_2

清单2:HI_JKLM_1

4 个答案:

答案 0 :(得分:5)

创建提取文件名“相同”部分的方法。 E.g。

public string GetRawName(string fileName)
{
    int index = fileName.LastIndexOf("_");
    return fileName.Substring(0, index);
}

并使用此方法进行分组:

var bigList = Directory.EnumerateFiles(@"C:\Users\derp\Desktop", "*.pdf")
                       .GroupBy(file => GetRawName(file))
                       .Select(g => g.ToList())
                       .ToList();

这将返回List<List<string>>(不包含ArrayList)。

UPDATE 这是正则表达式,可以处理所有类型的文件,无论它们是否在最后都有数字

public string GetRawName(string file)
{
    string name = Path.GetFileNameWithoutExtension(file);
    return Regex.Replace(name, @"(_\d+)?$", "")
}

分组:

var bigList = Directory.EnumerateFiles(@"C:\Users\derp\Desktop", "*.pdf")
                       .GroupBy(GetRawName)
                       .Select(g => g.ToList())
                       .ToList();

答案 1 :(得分:1)

除了您的问题没有确定“同名”的含义之外。这是一种典型的解决方案。

fileInfos.GroupBy ( f => f.FullName )
         .Select( grp =>  grp.ToList()  ).ToList();

答案 2 :(得分:1)

听起来困难在于决定哪些文件是相同的。

static string KeyFromFileName(string file)
{
   // Convert from "C_BA_20000_2" to "C_BA_20000"
   return file.Substring(0, file.LastIndexOf("_"));

   // Note: This assumes there is an _ in the filename.
}

然后您可以使用此LINQ构建fileSets列表。

using System.Linq; // Near top of file


var files = Directory.GetFiles(@"C:\Users\derp\Desktop", "*.pdf")

var fileSets = files
   .Select(file => file.FullName)
   .GroupBy(KeyFromFileName)
   .Select(g => new {g.Key, Files = g.ToList()}
   .ToList();

答案 3 :(得分:0)

这将为您提供列表列表...如果文件不包含下划线等,也不会抛出异常。

private string GetKey(FileInfo fi)
{
    var index = fi.Name.LastIndexOf('_');
    return index == -1 ? Path.GetFileNameWithoutExtension(fi.Name) 
                       : fi.Name.Substring(0, index);
}

var bigList = fileInfos.GroupBy(GetKey)
             .Select(x => x.ToList())
             .ToList();