在C#中按字母顺序生成文件

时间:2016-01-26 01:17:55

标签: c# .net

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

我能想到的一种方法是使用DateTime.Now和毫秒。有没有更好的方法来实现这一目标。

3 个答案:

答案 0 :(得分:2)

为了简化操作,您需要确保所有文件名包含相同数量的字符:

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


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

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

DateTime方法将是我的第一选择,因为它是自然进步的,我可以多次运行我的程序而不必担心覆盖任何东西。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

以下是如何进行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个已排序的文件,从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