2016-01-26 43 views
1

我正在嘗試編寫大量包含字符串的文件。文件必須按字母順序命名(a,b,c ..)。或者像1,11,12,13,2,21之類的任何東西,只要它們按字母順序排序即可。在C中按字母順序生成文件#

我可以想到的一種方法是使用DateTime.Now毫秒。有沒有更好的方法來實現這一點。

+1

a,b,c,...,z,aa,ab? –

+1

只使用字母,你只需要5個字符給你超過1100萬個獨特的文件名,所以我會從'aaaaa','aaaab','aaaac'等開始。 – DavidG

+1

爲什麼這麼複雜? ** a **,** aa **,** aaa **,...,** aaa .... aaaa **,...文件是否必須僅以字母命名或者它們是否有隻能按字母順序排序?這是什麼樣的作業? – Santhos

回答

0

使用的整數計數器,然後將數字轉換爲字符串和替換「0」與「一」,「1」,與「B」等

+2

爲什麼a,b?我猜int.ToString()。PadLeft(10,'0')將會完成這個工作 –

+0

@RamazanBinarbasi - 我想我是被問題中的'按字母順序排列(a,b,c ...)'這個位。但我想你是對的 - 在第二次閱讀時,名稱可以按照正確的順序通過字符串排序來排序。在這種情況下'counter.ToString(「000000」);'會做到這一點。 –

+0

@關於最終文件的Übercoder我相信它給了類似的東西100001,10002 ... 110000,但它們不是按字母順序排列的。正確的序列將是100001,110000,10002.請閱讀我對問題的編輯,並糾正我,如果我錯了。 – sam

2

爲了方便,你需要做確保所有文件名都包含相同數量的字符:

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


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

所有像這種模式創建的文件將按字母順序排列。

DateTime方法將是我的第一選擇,因爲它是自然進步的,我可以多次運行我的程序而不必擔心覆蓋任何東西。

+0

感謝您使用++序列解決方案。有沒有什麼辦法可以去除.ToString(「00000000」)中所需的零個數的硬編碼。我想過使用DateTime方法,但文件名不會那麼直觀,但我可以忍受那個:) – sam

+0

你需要硬編碼的數字格式,因爲「magic」出現在最後一個文件名字符中。如果你刪除它,你會有'1,10,11,2',你不希望那個 –

+0

只是想說關於最後的文件名字符:) – sam

0

這裏是你如何能做到阿爾法排序( '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,完美地完成你所要求的。接受的答案還包含完成相同的另一種方法。 (EX「AAAA」)

如果你想在你的文件名使用多個字母,這裏是你可以用它來獲得索引的方法:在GenerateFileNames()

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; 
} 

並與過載:

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:

這些文件按字母順序進行排序,你可以簡單地使用.Sort()方法上List這樣:

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 
+0

@levelonehumar,我試着運行GenerateFileNames(1000),輸出是a,b,c .... z,aa,ab。有沒有什麼辦法可以得到所有排序的結果,而不是按照a-z排序,然後按aa-zz排序輸出。 – sam

+0

@sum我已經更新了顯示按字母順序排列文件名的答案。如果你使用另一種採用起始集的方法(比如'AAAA'),那麼這可能是一個爭議點,因爲'AAAA' - 'ZZZZ'允許成千上萬的組合已經按字母順序生成。 – levelonehuman

+0

答案是正確的,但它不能解決問題。在創建它之後對字符串列表進行排序不是問題,應該對創建的字符串列表進行排序。正如我在問題中提到的,我必須編寫大量的文件(編號未知),我無法保留已經填充的字符串列表。雖然可以使用此解決方案,但它會濫用技術:) – sam