Сортировка файлов на основе переменной длины числовых цифр в их имени C # - PullRequest
0 голосов
/ 05 июня 2018

Я пишу программу для мониторинга проектов рендеринга Blender.Но у меня проблема с сортировкой выходных данных блендера (3d-программа).он генерирует файлы в числовом формате.Или в каком-то тексте, который заканчивается в числовом формате.

Проблема здесь в том, что он нумеруется следующим образом:
someprojectname-0001.png
someprojectname-0010.png
someprojectname-10104.png
someprojectname-10105.png
someprojectname-9999.png

Возможно, перед цифрами будет какой-то текст, но проблема в том, что до сих порсортировка, которую я пробовал, видит 9999 выше, чем 10104 (некоторые считают, что проблема заключается в лишних цифрах, и число цифр не исправлено.

должно вывести
someprojectname-0001.png
someprojectname-0010.png
someprojectname-9999.png
someprojectname-10104.png

по существу, объединяет все числа (игнорирует любой текст), затем упорядочивает по номерам, поэтому я попытался:

d = new DirectoryInfo(renderpath);

//  FileInfo[] files = d.GetFiles( rendertpye).OrderBy(p => p.Name).ToArray();

FileInfo[] files = d.GetFiles(rendertpye).OrderByDescending(o => string.IsNullOrEmpty(o.Name)).ThenBy(o =>
            {
                int result;
                if (Int32.TryParse(o.Name, out result))
                { return result; }
                else
                { return Int32.MaxValue; }
            }).ToArray();

Я также попробовал Numeric beforeAlpha sort (https://www.codeproject.com/Tips/543502/Numeric-before-alpha-sort-in-LINQ) И я попробовал (https://www.dotnetperls.com/alphanumeric-sorting).

Проблема, хотя ни они не могут справиться с не фиксированной числовой длиной файла Blendersнумерация.

update Моя цель здесь не состоит в том, чтобы устанавливать правила о том, как люди сохраняют свои BlendFiles, программе требуется массив, который извлекает все сохраненные файлы, и сортирует их по числу в имени файла, которое может иметь переменный размер цифры.

Я попробовал это с linq, но я начинаю сомневаться, что это можно сделать напрямую с Linq.Хотя, может быть, если мы создадим список int на основе имени файла, то упорядочим этот список и используем его для упорядочения исходного текста с именем list.

1 Ответ

0 голосов
/ 05 июня 2018

Решил, создал структуру (которая не идеальна для этого), в которую я добавил счетчик int для каждой записи fileinfo.И некоторые регулярные выражения для очистки текста из имен файлов, функция сохраняет исходные имена и fileInfo, но возвращает их, отсортированные по номерам, которые они содержат.

Возможно, в будущем расширение будет также сортироваться по последнему измененному свойству, что может быть проще.и небольшое улучшение может заключаться в том, чтобы находить числа только в конце имени, так как project2-frame33.blend станет проблематичным.возможно, какой-нибудь умный оператор мог бы сделать это.

struct numericfile
    {
        public int filenr; public FileInfo file;
    }
public List<FileInfo> SortedbyNumber(List<FileInfo> files)
    {
        List<numericfile> filesnrs = new List<numericfile>();
        foreach (FileInfo file in files)
        {
            numericfile nf = new numericfile();
            nf.filenr = Convert.ToInt32(Regex.Replace(file.Name, "[^0-9]+", string.Empty));
            nf.file = file;
            filesnrs.Add(nf);
        }
        filesnrs.Sort((s1, s2) => s1.filenr.CompareTo(s2.filenr));
        files.Clear();
        foreach (numericfile fnr in filesnrs)
        {
            files.Add(fnr.file);
        }
        return files;
    }
...