如何在给定排序方法或 lambda 的情况下对列表进行排序?

How do I sort a List given an ordering method or lambda?

如果我有一个方法或 lambda 来排序 List<T> 例如使用宇宙飞船运算符(来自 the documentationx <=> y - 如果 x < y,结果为负,如果 x == y,则结果为零,如果 x > y,则结果为正),如何使用该方法对列表进行排序?

List<T> 上有一个 Sort(Comparison<T>) 方法,但文档没有解释如何使用它。

例如,假设我想按长度对字符串列表进行排序,首先按升序排序,然后使用方法和 lambda 降序排序:

using System;
using System.Collections.Generic;

namespace test
{
    class Program
    {
        public static int ascendingMethod (String lhs, String rhs)
        {
            return lhs.Length <=> rhs.Length;
        }

        public static void Main()
        {
            function int(String lhs, String rhs) descendingLambda = (lhs, rhs) => 
                    rhs.Length <=> lhs.Length;

            let list = scope List<String>();
            list.Add("2Foobar");
            list.Add("1Fooba");
            list.Add("3Foob");

            //sort using Descending lamdba
            for(let s in list)
            {
                Console.WriteLine(s);
            }

            // sort using Ascending method
            for(let s in list)
            {
                Console.WriteLine(s);
            }
        }
    }
}

您可以分配 lambda 或将 Comparison<T> 绑定到方法,然后使用 List<T>.Sort(Comparison<T>)

String 示例中,它可能如下所示:

using System;
using System.Collections.Generic;

namespace test
{
    class Program
    {  
        public static int ascendingMethod (String lhs, String rhs)
        {
            return lhs.Length <=> rhs.Length;
        }

        public static void Main()
        {
            Comparison<String> descendingLambdaComparison = scope (lhs, rhs) => 
                    rhs.Length <=> lhs.Length;
            Comparison<String> ascendingMethodComparison = scope => ascendingMethod;

            let list = scope List<String>();
            list.Add("2Foobar");
            list.Add("1Fooba");
            list.Add("3Foob");

            list.Sort(descendingLambdaComparison);
            for(let s in list)
            {
                Console.WriteLine(s);
            }

            list.Sort(ascendingMethodComparison);
            for(let s in list)
            {
                Console.WriteLine(s);
            }
        }
    }
}