Как отсортировать словарные ключи по значению? - PullRequest
0 голосов
/ 23 января 2020

Если у меня есть Dictionary и лямбда, которые я могу использовать для упорядочения значений, как мне получить список или массив ключей, отсортированных по соответствующему значению в словаре?

Например, Что делать, если я хочу отсортировать Dictionary<String,int> в порядке убывания по значению:

using System.Collections.Generic;
using System;

namespace Program
{

    class Program
    {
        public static void Main()
        {
            let dict = scope Dictionary<String,int>();
            dict.Add("This should be second", 10);
            dict.Add("This should be first", 20);
            dict.Add("This should be fourth", 2);
            dict.Add("This should be third", 7);

            function int(int lhs, int rhs) descendingLambda = (lhs, rhs) => rhs <=> lhs;

            List<String> listOfKeys;

            // sort the keys by value into listOfKeys

            for (let s in listOfKeys)
            {
                Console.WriteLine(s);
            }
        }
    }
}

1 Ответ

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

Создайте List ключей, используя конструктор List(IEnumerator<T>), затем используйте Sort, оборачивая указатель значения в другую лямбду, которая обращается к словарю:

using System.Collections.Generic;
using System;

namespace Program
{

    class Program
    {
        public static void Main()
        {
            let dict = scope Dictionary<String,int>();
            dict.Add("This should be second", 10);
            dict.Add("This should be first", 20);
            dict.Add("This should be fourth", 2);
            dict.Add("This should be third", 7);

            function int(int lhs, int rhs) descendingLambda = (lhs, rhs) => rhs <=> lhs;

            let listOfKeys = scope List<String>(dict.Keys);

            listOfKeys.Sort(scope (lhs, rhs) => descendingLambda(dict[lhs], dict[rhs])); 

            for (let s in listOfKeys)
            {
                Console.WriteLine(s);
            }
        }
    }
}
...