-1

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

示例: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 中具有相同的模式,其中 i 是一个数字,可以从 1 到 n。同名文件最后只能有不同的编号。

AB_CDEFG_1

AB_CDEFG_2

HI_JKLM_1

输出应该是:

清单 1:AB_CDEFG_1 和 AB_CDEFG_2

清单 2:HI_JKLM_1

4

4 回答 4

5

创建提取文件名“相同”部分的方法。例如

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();
于 2012-12-07T20:15:43.763 回答
1

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

fileInfos.GroupBy ( f => f.FullName )
         .Select( grp =>  grp.ToList()  ).ToList();
于 2012-12-07T20:14:21.113 回答
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 构建文件集列表。

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();
于 2012-12-07T20:26:26.537 回答
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();
于 2012-12-07T20:47:14.713 回答