У меня есть папка, содержащая только файлы .txt. Я хочу, чтобы мой вывод имел определенный порядок.
Первые 2 цифры имени каждого файла являются его уникальным идентификатором. Я хочу упорядочить файлы в таком порядке
Я исследовал несколько вопросов, которые кажутся похожими на это, например Получение всех имен файлов из папки с помощью С#
но никто не помог мне достичь этой цели. Каков самый простой способ получить желаемый результат?
string folder = @"C:\Testing\";
var txtFiles = Directory.GetFiles(folder, "*.txt")
.Select(Path.GetFileName)
.ToList();
foreach(var f in txtFiles)
{
Console.WriteLine(f);
}
Console.ReadKey();
Обзор Windows
Консольный вывод
Возможный дубликат Сортировка массива имен папок, таких как Проводник Windows (в числовом и алфавитном порядке) - VB.NET
Вы можете просто использовать оператор linq OrderBy и проанализировать имя файла, чтобы получить то, что вы хотите. Также вам не нужен ToList()
, если все, что вам нужно, это простой список, такой как IEnumerable
.
Например:
var txtFiles = Directory.EnumerateFiles(folder, "*.txt")
.Select(Path.GetFileName)
.OrderBy(file =>
{
string[] nameParts = file.Split('_');
if (nameParts.Length > 0)
{
int sortValue;
if (int.TryParse(nameParts[0], out sortValue))
{
return sortValue;
}
}
return 0;
});
Если вы хотите, чтобы это было в порядке, вы лучше разложите его. используя метод расширения .OrderBy.
string folder = @"C:\Testing\";
var txtFiles = Directory.GetFiles(folder, "*.txt")
.Select(Path.GetFileName)
.OrderBy(x => x)
.ToList();
foreach (var f in txtFiles)
{
Console.WriteLine(f);
}
Console.ReadKey();
Это не помогает в соответствии с выводом примера OP.
Более простой альтернативой может быть использование padding :
var txtFiles = Directory.EnumerateFiles(folder, "*.txt")
.Select(Path.GetFileName)
.OrderBy(s => s.PadLeft(11));
Это заполняет первую секцию чисел нулями для целей сортировки:
string folder = @"C:\Testing";
var txtFiles = Directory.GetFiles(folder, "*.txt")
.Select(Path.GetFileName)
.OrderBy(f => f.Split('_')[0].PadLeft(5, '0'));
foreach (var f in txtFiles)
{
Console.WriteLine(f);
}
Используйте сортировку с собственной функцией сравнения — stackoverflow.com/questions/1832684/…