【问题标题】:Generating files in alphabetical order in C#在 C# 中按字母顺序生成文件
【发布时间】:2016-01-26 01:17:54
【问题描述】:

我正在尝试编写大量包含字符串的文件。文件必须按字母顺序命名(a,b,c..)。或类似 1, 11, 12 13, 2 ,21.. 的任何东西,只要它们按字母顺序排序即可。

我能想到的一种方法是将 DateTime.Now 与毫秒一起使用。有没有更好的方法来实现这一点。

【问题讨论】:

  • a, b, c, ..., z, aa, ab ?
  • 只使用字母,您只需要 5 个字符即可为您提供超过 1100 万个唯一文件名,所以我会以 aaaaaaaaabaaaac 等开头。
  • 为什么这么复杂? aaaaaa、...、aaa....aaaa、...文件必须仅用字母命名,还是必须仅按字母顺序排序?那是什么作业?
  • 你应该阅读How to Ask
  • @sum 你能用一些更精确的例子来细化你的文件名要求吗?

标签: c# .net


【解决方案1】:

为方便起见,您需要确保所有文件名包含相同数量的字符:

DateTime.Now.ToString("yyyyMMdd-HHmmss-fffffff") // "20160126-165224-5464781"


var sequence = 0;
// ...
(++sequence).ToString("0000000000"); // "0000000001"

以这种模式创建的所有文件都将按字母顺序排列。

DateTime 方法是我的首选,因为它自然是渐进式的,我可以多次运行我的程序而不必担心覆盖任何内容。

【讨论】:

  • 感谢您的 ++sequence 解决方案。有什么方法可以删除 .ToString("00000000") 中所需的零个数的硬编码。我想过使用 DateTime 方法,但文件名不会那么直观,但我可以接受 :)
  • 您需要对数字格式进行硬编码,因为“魔法”出现在最后一个文件名字符中。如果你删除它,你会得到 '1, 10, 11, 2' 而你不想这样
  • 只是想说最后一个文件名字符:)
  • 整数类型可以使用.ToString("0000000000"),而不是.ToString("D10")
【解决方案2】:

使用整数计数器,然后将数字转换为字符串,并将“0”替换为“a”、“1”、“b”等。

【讨论】:

  • 为什么是 a,b?我猜 int.ToString().PadLeft(10, '0') 会完成这项工作
  • @RamazanBinarbasi - 我想我被问题中的named alphabetically (a, b, c...) 所吸引。但我想你是对的 - 在第二次阅读时,似乎可以通过字符串排序以正确的顺序对名称进行排序。在那种情况下,counter.ToString("000000"); 就可以了。
  • @Übercoder 用于结束文件我相信它会给出类似的 100001, 10002... 110000 但它们不是按字母顺序排列的,而是按数字顺序排列的。正确的顺序是 100001,110000,10002。请阅读我对问题的编辑,如果我错了,请纠正我。
【解决方案3】:

以下是进行 alpha 排序的方法('a-z'、'aa-zz' 等):

public static void GenerateFileNames(int totalFiles)
{
    for (int i = 0; i < totalFiles; i++)
    {
        Console.WriteLine(GetString(i));
    }
}

public static string GetString(int index)
{
    if (index < 26)
    {
        return ((char)('A' + index)).ToString();
    }

    return GetString(index / 26 - 1) + GetString(index % 26);
}

只需使用文件总数调用GenerateFileNames()GetString() 函数将返回以A 开头并按字母顺序从最后一个文件名向上的文件名。

此答案取自linked question,可以完美地满足您的要求。接受的答案还包含另一种实现相同目的的方法。

如果您想在文件名中使用更多字母(例如“AAAA”),可以使用以下方法获取索引:

public static int GetStartIndex(string letters)
{
    int index = 0;

    for (int i = letters.Length - 1; i > 0; i--)
    {
        index += (int)Math.Pow(26, i);
    }

    return index;
}

GenerateFileNames() 过载:

public static void GenerateFileNames(int totalFiles, int startIndex)
{
    for (int i = startIndex; i < totalFiles + startIndex; i++)
    {
        Console.WriteLine(GetString(i));
    }
}

您可以调用GenerateFileNames(100, GetStartIndex("AAAA")); 写入100 个alpha 排序的文件,以AAAA 开头。

编辑:

我应该注意,对于比AAAA 长得多的字符串,您可能希望使用long 而不是int,因为指数。数字增长很快!这种方法应该适用于长度不超过 7 个字母的文件,并且在转换为 long 时会更高。

编辑 2:

要按字母顺序对这些文件进行排序,您可以简单地在 List 上使用 .Sort() 方法:

public static List<string> GenerateSortedFileNames(int totalFiles)
{
    List<string> names = new List<string>();

    for (int i = 0; i < totalFiles; i++)
    {
        names.Add(GetString(i));
    }

    names.Sort();


    return names;
}

然后像这样使用它:

List<string> SortedNames = GenerateSortedFileNames(100);

foreach (string fileName in SortedNames)
{
    Console.WriteLine(fileName);
}
//Outputs A,AA,AB,AC ... X,Y,Z

【讨论】:

  • @levelonehumar,我尝试运行 GenerateFileNames(1000),输出为 a,b,c....z,aa,ab。有没有办法让所有结果排序而不是 a-z 排序然后 aa-zz 排序有点输出。
  • @sum 我已更新答案以显示按字母顺序排列文件名。如果您使用采用起始集的其他方法(例如AAAA),那么这可能是一个有争议的问题,因为AAAA - ZZZZ 允许已经按字母顺序生成的数千个组合。跨度>
  • 答案是正确的,但不能解决问题。创建后对字符串列表进行排序不是问题,创建的字符串列表应该进行排序。正如我在问题中提到的,我必须编写大量文件(数量未知),我无法保留已经填充的字符串列表。虽然可以使用此解决方案,但它会滥用技术:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2021-10-07
  • 1970-01-01
相关资源
最近更新 更多