【问题标题】:Group files in a directory based on their prefix根据前缀对目录中的文件进行分组
【发布时间】:2012-07-17 15:37:12
【问题描述】:

我有一个图片文件夹:

文件夹 1:

文件:

ABC-138923
ABC-3223
ABC-33489
ABC-3111
CBA-238923
CBA-1313
CBA-1313
DAC-38932
DAC-1111
DAC-13893
DAC-23232 
DAC-9999

我想浏览这个文件夹并计算我有多少张图片前缀。

例如上面有4张前缀ABC图片和3张前缀CBA图片。

我很难弄清楚如何循环通过它。谁能帮帮我?

【问题讨论】:

    标签: c# for-loop


    【解决方案1】:

    不是循环,而是更清晰易读:

    string[] fileNames = ...; //some initializing code
    var prefixes = fileNames.GroupBy(x => x.Split('-')[0]).
        Select(y => new {Prefix = y.Key, Count = y.Count()});
    

    更新:

    显示每个前缀的计数:

    foreach (var prefix in prefixes)
    {
        Console.WriteLine("Prefix: {0}, Count: {1}", prefix.Prefix, prefix.Count);
    }
    

    【讨论】:

    • 错误 1 ​​'System.Linq.IGrouping' 不包含 'Value' 的定义,并且没有扩展方法 'Value' 接受类型为 'System.Linq.IGrouping 的第一个参数' 可以找到(您是否缺少 using 指令或程序集引用?)
    • @user1336632,我的错。现已修复。
    • 我不熟悉这段代码(抱歉,我还是个菜鸟),但是我该如何从你的代码中获取每个前缀的计数以将其显示给用户?
    【解决方案2】:

    这里有一个“foreach”循环:

    var directoryPath = ".\Folder1\";
    var prefixLength = 3;
    var accumulator = new Dictionary<string, int>();
    
    foreach (var file in System.IO.Directory.GetFiles(directoryPath)) {
        var prefix = filefile.Replace(directoryPath, string.Empty).Substring(0, prefixLength);
    
        if (!accumulator.ContainsKey(prefix))
        {
            accumulator.Add(prefix, 0);
        }
    
        accumulator[prefix]++;
    }
    
    foreach(var prefix in accumulator.Keys) {
        Console.WriteLine("{0}: {1}", prefix, accumulator[prefix]);
    }
    

    【讨论】:

      【解决方案3】:

      在 C# 中,

      using System.IO;
      using System.Collections.Generic;
      
      ...
      
                  DirectoryInfo dir = new DirectoryInfo("C:\\yourfolder");
                  FileInfo[] files = dir.GetFiles();
                  List<string> prefix = new List<string>();
                  List<int> count = new List<int>();
      
                  foreach (FileInfo file in files)
                  {
                      if (prefix.Count > 0)
                      {
                          Boolean AddNew = true;
                          for (int i = 0; i < prefix.Count; i++)
                          {
                              if (file.Name.Substring(0, 3) == prefix[i])
                              {
                                  count[i]++;
                                  AddNew = false;
                              }
                          }
                          if (AddNew)
                          {
                              prefix.Add(file.Name.Substring(0, 3));
                              count.Add(1);
                          }
                      }
                      else
                      {
                          prefix.Add(file.Name.Substring(0, 3));
                          count.Add(1);
                      }
                  }
      
      ...
      

      前缀字符串列表与计数列表平行,因此您可以循环访问数组。我还没有测试或优化它,但如果你沿着这条路线 (c#) 前进,这可能是一个开始。

      【讨论】:

        【解决方案4】:

        算法:

        1. 创建字典:

          Dictionary&lt;string, int&gt; D;

        2. 使用以下方法循环目录:

          foreach (var file in System.IO.Directory.GetFiles(dir)) ...

        为每个文件完成以下 3 个步骤:

        1. 提取前缀并查看D 中是否存在匹配键。如果为真,请转到第 3 步。
        2. 将前缀作为新键插入D,值为0
        3. 将键的值增加1

        在整个目录处理完毕后显示结果:

        foreach (KeyValuePair<string, int> pair in D)
            Console.WriteLine("{0} prefix has {1} files", pair.Key, pair.Value);
        

        【讨论】:

        • @user1336632 - 发布了一个示例算法,您应该可以使用它来实现您的应用程序。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-16
        相关资源
        最近更新 更多