Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建包含相同名称的文档列表_C#_.net - Fatal编程技术网

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

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

我正在创建一个工具,用来连接包含相同名称的文档

示例: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);
然后有一个包含类似文档的所有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 for
GroupBy(KeyFromFileName)
-调用键解析器方法的更好方法。但是OP想要一个文件名列表。。