В C#, как лучше всего выполнять синтаксический анализ и сортировку по строке времени? - PullRequest
0 голосов
/ 08 мая 2020

Я читаю и загружаю файлы в Excel, используя C# VSTO, и имена файлов выглядят примерно так:

C:\myfiles\1000AM.csv
C:\myfiles\1100AM.csv
C:\myfiles\1200PM.csv
C:\myfiles\100PM.csv
C:\myfiles\200PM.csv

И затем я помещаю их в список и мне нужно отсортировать их по " время".

Как преобразовать строку в указанном выше формате в объект времени, который можно использовать для сортировки?

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Вам нужно как-то извлечь временные части, а затем сравнить их друг с другом.

Вы можете, например, сделать это, используя Comparison<string>. Вот пример, в котором для этого используется тип Span<T> без выделения дополнительного мусора:

List<string> list = new List<string>() { ... }

list.Sort((a, b) => 
{
    //compare AM/PM
    int compareAmAndPm = a.AsSpan().Slice(a.Length - 6, 2)
        .CompareTo(b.AsSpan().Slice(b.Length - 6, 2), StringComparison.Ordinal);
    if (compareAmAndPm != 0)
        return compareAmAndPm;

    //compare the times as integers
    int index = a.LastIndexOf('\\');
    var firstTime = int.Parse(a.AsSpan().Slice(index + 1, a.Length - index - 7));

    index = b.LastIndexOf('\\');
    var secondTime = int.Parse(b.AsSpan().Slice(index + 1, b.Length - index - 7));


    return firstTime.CompareTo(secondTime);
});

Это должно дать вам следующий результат:

C: \ myfiles \ 1000AM.csv
C: \ myfiles \ 1100AM.csv
C: \ myfiles \ 100PM.csv
C: \ myfiles \ 200PM.csv
C: \ myfiles \ 1200PM.csv

0 голосов
/ 08 мая 2020

Из практики мы выяснили, что время или дата сами по себе не работают в 99% случаев. Нам нужны оба параметра плюс часовой пояс, чтобы иметь надежду на их осмысленную обработку.

Вот почему в настоящее время у нас есть только такие вещи, как DateTime. В идеале эти имена файлов должны состоять из полного DateTime в UT C и инвариантном языке. Если у вас есть возможность изменить способ их создания, используйте ее.

Однако, если у вас постоянно есть только одна часть, это не проблема: DateTime просто использовал значения по умолчанию для двух других. И поскольку эти двое будут последовательными, они будут работать. Единственная проблема будет заключаться в нахождении настройки культуры, которая использует этот формат AM / PM.

...