Сортировка файла по содержимому его имени - PullRequest
2 голосов
/ 02 декабря 2010

У меня есть список файлов, которые я хотел бы отсортировать по дате.Предостережение заключается в том, что каждый файл в списке содержит дату как часть имени файла, я хочу отсортировать файлы на основе этой даты.Причина этого заключается в том, что дата в строке имени файла коррелирует с содержимым файла, т. Е. Фактическое свойство даты каждого файла, дата создания, изменения, обращения и т. Д. Могут изменяться при каждом перемещении файла.или изменены, и поэтому я не могу полагаться на это в моих целях.Я создаю пользовательский компаратор для использования в методе сортировки списков, но я хотел посмотреть, есть ли у кого-нибудь еще какие-то лучшие или уникальные подходы к этому.Заранее спасибо.

ОБНОВЛЕНИЕ:

В ответ на комментарий Саида имя файла имеет следующий формат:

{Test Name}_{YYYYMMDD}_{HHmmSS}.txt

Где ГГГГММДД и ЧЧммСС - это дата и время, соответственно.

ОБНОВЛЕНИЕ 2:

Хорошо, у меня есть записанный компаратор, который, кажется, отлично справляется с работой, вот если это поможет кому-то еще;это не займет много усилий, чтобы изменить его для поиска любых других элементов в имени файла, просто нужно изменить регулярное выражение.Спасибо всем за предложения, конструктивная критика всегда приветствуется.

public class TDRDateTimeComparer : IComparer<FileInfo>
{
    public int Compare(FileInfo x, FileInfo y)
    {
       //Return if both strings are null or empty
        if (string.IsNullOrEmpty(x.Name) && string.IsNullOrEmpty(y.Name))
        {
            return 0;
        }
        Regex rDateTime = new Regex(@"(19|20|21)\d\d(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])_([0-1]\d|2[0-3])([0-5]\d)([0-5]\d)");

        /* NOTE: File names will already have been validated at this point, so no need to validate the date/time again.*/
        string date1 = rDateTime.Match(x.Name).Value, date2 = rDateTime.Match(y.Name).Value;
        DateTime d1 = DateTime.ParseExact(date1, "yyyyMMdd_HHmmss", null), d2 = DateTime.ParseExact(date2, "yyyyMMdd_HHmmss", null);

        return d1.CompareTo(d2);
    }
}

Ответы [ 3 ]

2 голосов
/ 02 декабря 2010

Я бы сказал, что пользовательский компаратор - это путь.Просто используйте regex, чтобы извлечь части даты, затем создайте из нее DateTime и сравните их.

1 голос
/ 02 декабря 2010

Раньше я работал в системе, которая генерировала файлы с датой и временем, закодированными в имени файла.Формат даты вписывается в старый формат имени файла DOS 8.2.

Из-за соглашения о присвоении имен, когда вы перечисляете файлы в файловой системе, они были естественно отсортированы правильно.Если у вас есть такой уровень контроля, вы можете рассмотреть возможность сделать это таким образом.то есть, присвоив ему имя ГГГГММДД ... по умолчанию они будут отсортированы по дате.

Дополнительный код не требуется.

1 голос
/ 02 декабря 2010

Вы можете использовать метод расширения OrderBy и указать значение для сортировки.Пример:

list = list.OrderBy(f => DateTime.Parse(Path.GetFileName(f.Name))).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...