我正在嘗試編寫大量包含字符串的文件。文件必須按字母順序命名(a,b,c ..)。或者像1,11,12,13,2,21之類的任何東西,只要它們按字母順序排序即可。在C中按字母順序生成文件#
我可以想到的一種方法是使用DateTime.Now毫秒。有沒有更好的方法來實現這一點。
我正在嘗試編寫大量包含字符串的文件。文件必須按字母順序命名(a,b,c ..)。或者像1,11,12,13,2,21之類的任何東西,只要它們按字母順序排序即可。在C中按字母順序生成文件#
我可以想到的一種方法是使用DateTime.Now毫秒。有沒有更好的方法來實現這一點。
使用的整數計數器,然後將數字轉換爲字符串和替換「0」與「一」,「1」,與「B」等
爲什麼a,b?我猜int.ToString()。PadLeft(10,'0')將會完成這個工作 –
@RamazanBinarbasi - 我想我是被問題中的'按字母順序排列(a,b,c ...)'這個位。但我想你是對的 - 在第二次閱讀時,名稱可以按照正確的順序通過字符串排序來排序。在這種情況下'counter.ToString(「000000」);'會做到這一點。 –
@關於最終文件的Übercoder我相信它給了類似的東西100001,10002 ... 110000,但它們不是按字母順序排列的。正確的序列將是100001,110000,10002.請閱讀我對問題的編輯,並糾正我,如果我錯了。 – sam
爲了方便,你需要做確保所有文件名都包含相同數量的字符:
DateTime.Now.ToString("yyyyMMdd-HHmmss-fffffff") // "20160126-165224-5464781"
var sequence = 0;
// ...
(++sequence).ToString("0000000000"); // "0000000001"
所有像這種模式創建的文件將按字母順序排列。
DateTime
方法將是我的第一選擇,因爲它是自然進步的,我可以多次運行我的程序而不必擔心覆蓋任何東西。
這裏是你如何能做到阿爾法排序( '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
@levelonehumar,我試着運行GenerateFileNames(1000),輸出是a,b,c .... z,aa,ab。有沒有什麼辦法可以得到所有排序的結果,而不是按照a-z排序,然後按aa-zz排序輸出。 – sam
@sum我已經更新了顯示按字母順序排列文件名的答案。如果你使用另一種採用起始集的方法(比如'AAAA'),那麼這可能是一個爭議點,因爲'AAAA' - 'ZZZZ'允許成千上萬的組合已經按字母順序生成。 – levelonehuman
答案是正確的,但它不能解決問題。在創建它之後對字符串列表進行排序不是問題,應該對創建的字符串列表進行排序。正如我在問題中提到的,我必須編寫大量的文件(編號未知),我無法保留已經填充的字符串列表。雖然可以使用此解決方案,但它會濫用技術:) – sam
a,b,c,...,z,aa,ab? –
只使用字母,你只需要5個字符給你超過1100萬個獨特的文件名,所以我會從'aaaaa','aaaab','aaaac'等開始。 – DavidG
爲什麼這麼複雜? ** a **,** aa **,** aaa **,...,** aaa .... aaaa **,...文件是否必須僅以字母命名或者它們是否有隻能按字母順序排序?這是什麼樣的作業? – Santhos