Как мне отсортировать список с учетом метода заказа или лямбда? - PullRequest
0 голосов
/ 20 января 2020

Если у меня есть метод или лямбда для сортировки List<T>, например, с помощью оператора космического корабля (из документации : x <=> y - результаты отрицательные, если x y), как я могу отсортировать список с помощью этого метода?

Существует метод Sort(Comparison<T>) на List<T>, но документация не объясняет, как его использовать.

Например, предположим, что я хочу отсортировать список строк по их длине, сначала в порядке возрастания, затем в порядке убывания, используя метод и лямбду:

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);
            }
        }
    }
}

1 Ответ

0 голосов
/ 20 января 2020

Вы можете назначить лямбду или привязать 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);
            }
        }
    }
}
...