2016-01-26 3 views
1

Я пытаюсь написать большое количество файлов, содержащих строки. Файлы должны быть названы в алфавитном порядке (a, b, c ..). или что-нибудь вроде 1, 11, 12 13, 2, 21 .. если они отсортированы в алфавитном порядке.Создание файлов в алфавитном порядке в C#

Один из способов, которым я мог подумать, - использовать DateTime.Now с миллисекундами. Есть ли лучший способ достичь этого.

+1

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

+1

Используя только буквы, вам нужно всего 5 символов, чтобы дать вам более 11 миллионов уникальных имен файлов, поэтому я бы начал с '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. Я думаю, что я был взят бит 'named в алфавитном порядке (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

Вам нужен этот формат чисел, закодированный, поскольку «магия» встречается в последнем символе имени файла. Если вы удалите его, у вас будет «1, 10, 11, 2», и вы не хотите, чтобы –

+0

просто хотел сказать о последнем символе имени файла :) – sam

0

Вот как вы можете сделать альфа рода («A-Z», «аа-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.

EDIT:

Я хотел бы отметить, что для строк гораздо больше, чем AAAA, вы можете использовать long вместо int, так как экспонент. Числа быстро растут! Этот метод должен работать так же, как и файлы длиной до 7 букв, а также бит с более высокой скоростью при преобразовании в long.

EDIT 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

Смежные вопросы