使用自定义比较器对MM-YYYY字符串进行排序



如何使用内存优化的自定义比较器对mm-yyyy字符串列表以及混合词进行排序。

List<string> result = new List<string>();
result.Add("04-2020");
result.Add("03-2021");
result.Add("Nan");

您可以按照Ran在回答中的建议使用Linq,它会很好地工作
然而,还有另一种可能会对内存进行更多优化的选择(尽管无可否认,我没有检查(:

List<T>类型有一个内置的Sort方法,该方法有几个重载,其中一个重载接受Comparison<T>委托。

使用它可能会比使用Linq更好地优化内存,因为您不需要分配新的List<T>。以下是使用它的一种方法(当然,您可以使用命名方法而不是lambda表达式(:

result.Sort((a, b) => { 
var dateA = DateTime.TryParseExact(a, "MM-yyyy", CultureInfo.InvariantCulture,DateTimeStyles.None, out var dtA) ? dtA : DateTime.MinValue; // change to MaxValue if needed
var dateB = DateTime.TryParseExact(b, "MM-yyyy", CultureInfo.InvariantCulture,DateTimeStyles.None, out var dtB) ? dtB : DateTime.MinValue; // change to MaxValue if needed
return dateB.CompareTo(dateA); // Assending order
return dateA.CompareTo(dateB); // Descending order
});

您可以使用Linq和DateTime.TryParseExact 来实现这一点

var orderedList = result.OrderByDescending(x =>
DateTime.TryParseExact(x, "MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt)
? dt
: default
).ToList();

如果您还想对"非日期";,那么你不能忽视这些(建立在以前的答案之上(:

List<string> result = new List<string>();
result.Add("04-2020");
result.Add("03-2021");
result.Add("04-2021");
result.Add("2-2021");
result.Add("Nan");
result.Add("Aan");
result.Add("Xan");
var sorted = result.OrderBy(s =>
{
DateTime dt;
if (DateTime.TryParseExact(s, "M-yyyy",
System.Globalization.CultureInfo.InvariantCulture, 
System.Globalization.DateTimeStyles.None, out dt))
return (dt, "");
return (DateTime.MaxValue, s);
}).ToList();

这构建了一个元组(DateTime,string(,在解析时填充日期,否则只填充字符串(使用原始字符串值(。

结果:

2020年4月
2021年2月
3021年3月
Aan
Nan
Xan

最新更新