我正在创建一个应该连接包含相同名称的文档的工具。
示例: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
答案 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();