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

Asi*_*bal 1 c#

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

List<string> result = new List<string>();
result.Add("04-2020");
result.Add("03-2021");
result.Add("Nan");
Run Code Online (Sandbox Code Playgroud)

Zoh*_*led 6

您可以按照 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
        });
Run Code Online (Sandbox Code Playgroud)


Ran*_*ner 5

您可以Linq使用DateTime.TryParseExact来实现此目的

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