C# 创建包含相同名称的文档列表
我正在创建一个工具,用来连接包含相同名称的文档 示例:C_BA_20000_1.pdf和C_BA_20000_2.pdf 这些文件应分组在一个列表中。 该工具运行在一个目录上,比如说C# 创建包含相同名称的文档列表,c#,.net,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("*.p
//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);
然后有一个包含类似文档的所有ArrayList的列表
List<ArrayList> bigList = new List<ArrayList>();
List bigList=new List();
所以我的问题是,如何对包含相同名称的文件进行分组并将它们放在相同的列表中
编辑:
文件名AB_CDEFG_i中的模式相同
其中i是一个数字,可以是1-n。具有相同名称的文件的末尾应该只有不同的编号
AB_CDEFG_1
AB_CDEFG_2
你好,JKLM_1
输出应为:
列表1:AB_CDEFG_1和AB_CDEFG_2
清单2:HI_JKLM_1除了你的问题没有指出“同一个名字”是什么意思之外。这是一个典型的解决方案
fileInfos.GroupBy ( f => f.FullName )
.Select( grp => grp.ToList() ).ToList();
创建提取文件名“相同”部分的方法。例如
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();
这将返回列表
(不带数组列表
)
更新这里是正则表达式,它可以处理所有类型的文件,不管文件末尾是否有数字
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();
听起来困难在于确定哪些文件是相同的
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();
这将为您提供一个列表。。。如果文件不包含下划线等,也不会引发异常
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();
你的意思是说
C_-BA_20000_1
和C_-BA_20000_2
应该在同一个列表中,因为它们以C_-BA_20000_
@raym0开头。你如何确定文件具有相同的名称?如果它们都以C开头,它们是相同的吗?我想我以前从未见过有人创建列表
。@所有人请检查问题同样,fileInfos.GroupBy不存在:因此必须使用System.Linq包含代码>在顶部。但这将再次比较文件名,很明显您需要某种逻辑,因此您必须确定如何比较文件名。@StanR。只需添加键选择器,并返回文件名而不是整个文件信息,这也是正确的解决方案:)@lazyberezovsky当然,在他改变问题之前我写了这篇文章……然后我停止了以下内容:)我不介意你可以拥有所有的荣耀+1对于目录。枚举文件
您每天都能学到新东西!ha:)@raym0nd我添加了update,它使用正则表达式提取原始文件name@raym0nd用GetFileNameWithoutExtension
验证上一次更新,我知道应该删除regex的扩展名,但这是在我发布regex示例:)+1 forGroupBy(KeyFromFileName)
-调用键解析器方法的更好方法。但是OP想要一个文件名列表。。