根据前缀对目录中的文件进行分组

时间:2012-07-17 15:37:13

标签: c# for-loop

我有一个带图片的文件夹:

文件夹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图片。

我很难弄清楚如何循环使用它。有人可以帮我一把吗?

4 个答案:

答案 0 :(得分:4)

不是循环,但更清晰可读:

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

<强> UPD:

显示每个前缀的计数:

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

答案 1 :(得分:1)

这是一个'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]);
}

答案 2 :(得分:0)

算法:

  1. 创建字典:

    Dictionary<string, int> D;

  2. 使用以下方式遍历目录:

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

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

    1. 解压缩前缀并查看D中是否存在匹配的密钥。如果为TRUE,请转到步骤3.
    2. D中插入前缀作为新密钥,值为0
    3. 1
    4. 增加键值

      要在处理整个目录时显示结果:

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

答案 3 :(得分:0)

在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#),这可能是一个开始。