Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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#FileInfo-查找重复文件_C#_File_Fileinfo - Fatal编程技术网

C#FileInfo-查找重复文件

C#FileInfo-查找重复文件,c#,file,fileinfo,C#,File,Fileinfo,我有一个FileInfo数组,包含约200.000个文件条目。我需要找到所有具有相同文件名的文件。我需要作为每个重复文件的结果的目录名和文件名,因为我想在以后重命名它们 我已经尝试过的: 将每个条目与整个列表进行比较,其中2个表示“循环”//坏主意,这将需要数小时甚至数天^^ 尝试使用Linq排序//因为我在写正确的语句之前没有使用Linq,也许有人可以帮我:) 听起来应该这样做: var duplicateNames = files.GroupBy(file => file.Name)

我有一个
FileInfo
数组,包含约200.000个文件条目。我需要找到所有具有相同文件名的文件。我需要作为每个重复文件的结果的目录名和文件名,因为我想在以后重命名它们

我已经尝试过的:

  • 将每个条目与整个列表进行比较,其中2个表示“循环”//坏主意,这将需要数小时甚至数天^^
  • 尝试使用Linq排序//因为我在写正确的语句之前没有使用Linq,也许有人可以帮我:)

听起来应该这样做:

var duplicateNames = files.GroupBy(file => file.Name)
                          .Where(group => group.Count() > 1)
                          .Select(group => group.Key);
现在是学习LINQ的好时机。它非常有用——花在学习上的时间(即使只是LINQ到对象)会很快得到回报

编辑:好的,如果您想要每个组的原始
FileInfo
,只需删除选择:

var duplicateGroups = files.GroupBy(file => file.Name)
                           .Where(group => group.Count() > 1);

// Replace with what you want to do
foreach (var group in duplicateGroups)
{
     Console.WriteLine("Files with name {0}", group.Key);
     foreach (var file in group)
     {
         Console.WriteLine("  {0}", file.FullName);
     }
}
这应该起作用:

HashSet<string> fileNamesSet = new HashSet<string>();
List<string> duplicates = new List<string>();

foreach(string fileName in fileNames)
{
    if(fileNamesSet.Contains(fileName))
    {
        duplicates.Add(fileName);
    }
    else
    {
        fileNamesSet.Add(fileName);
    }
}
HashSet filenameset=newhashset();
列表重复项=新列表();
foreach(文件名中的字符串文件名)
{
if(filenameset.Contains(fileName))
{
重复项。添加(文件名);
}
其他的
{
添加(文件名);
}
}
然后,副本将包含所有重复文件名的列表


请注意,由于windows文件名不区分大小写,您可能希望首先使用.ToUpperInvariant()将所有文件名转换为大写,从而考虑到这一点。

My Bad,您的解决方案非常有效,但是我不想说我需要知道每个重复的文件的名称-Directoy名称+文件名,因为我想重命名它们:)对不起,谢谢。太好了,我已经知道LINQ有时真的很方便,但我从来没有想到它会那么棒。如果允许我问一下,你有什么最喜欢的页面可以学习LINQ使用吗?@user1168998:不是真的-但是你可以查看MSDN,例如。你不需要先做包含检查-你可以调用
filenameset.Add(fileName)
并检查返回值,对于重复项,这将是错误的。我认为这样做的目的更清楚-即使不知道HashSet类,其含义也应该是显而易见的。就个人而言,我更希望知道我使用的API:)(集合添加方法返回是否真的进行了更改是很常见的-这并不是一个特别“隐藏”的方法你会使用ContainsKey,然后使用索引器而不是TryGetValue作为字典吗。我可以直接发表评论