[英]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.