我正在嘗試使用無效/空值對字串格式的日期欄位進行排序。但是,我沒有得到預期的結果。
var dataList = new List<string>();
dataList.Add("12/01/2020");
dataList.Add("12/01/2021");
dataList.Add("11/09/2022");
dataList.Add("01/31/2022");
dataList.Add("99999999");
dataList.Add(null);
var result = dataList.OrderByDescending(x =>
DateTime.TryParseExact(x, "MM/dd/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime endDate))
.ThenByDescending(x => x)
.ToList();
我預計 2022 年 9 月 11 日將首先出現。但是,12/01/2021 反而首先出現。任何解決此問題的建議將不勝感激。
uj5u.com熱心網友回復:
您按字串排序,而不是日期時間。“12”在“11”之后。在找到第二個字符的差異后,不再比較字串的其余部分(因此還有月份和年份)。按日期時間排序您的串列:
var result = dataList
.OrderByDescending(x => DateTime.TryParseExact(x, "MM/dd/yyyy", System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime endDate) ? endDate : default(DateTime?))
.ToList();
在線演示:https : //dotnetfiddle.net/G9VvXH
uj5u.com熱心網友回復:
原始代碼決議日期但將結果丟棄,然后按字串排序。這將通過首先放置有效的日期時間進行排序,如果有效則按日期時間排序,如果無效則按字串值排序。請注意,對于無效日期,按字串排序沒有意義,但至少這是確定性的,例如它不會隨機排序無效字串。
var result = dataList
.Select(x => new {
dateString = x,
valid = DateTime.TryParseExact(x, "MM/dd/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime end),
endDate = end,
})
.OrderBy(x => x.valid ? 0 : 1)
.ThenByDescending(x => x.endDate)
.ThenByDescending(x => x.dateString)
.Select(x => x.dateString)
.ToList();
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/408621.html
標籤:
