簡體   English   中英

在 C# 中,解析並按時間字符串排序的最佳方法是什么?

[英]In C#, what is the best way to Parse out and sort by time string?

我正在使用 C# VSTO 讀取文件並將其加載到 Excel 中,文件名如下所示:

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

然后我把這些放在一個列表中,需要按“時間”對它們進行排序。

如何將上述格式的字符串轉換為可用於排序的時間 object?

您需要以某種方式提取時間部分,然后將它們相互比較。

例如,您可以使用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

從實踐中我們發現,在 99% 的情況下,僅靠時間或日期是行不通的。 我們需要兩者加上時區才能有意義地處理它們。

這就是為什么我們現在只有DateTime這樣的東西。 理想情況下,這些文件名應包含完整的 DateTime,采用 UTC 和 Invariant 文化。 如果您可以選擇更改創建方式,請使用它。

但是,如果您始終只有一個不是問題的部分: DateTime只是對其他兩個使用默認值。 由於這兩個將是一致的,它們將起作用。 唯一的問題將是找到一種能夠適應 AM/PM 格式的文化環境。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM