C # Как отсортировать вложенный словарь по значению - PullRequest
0 голосов
/ 13 июня 2018

Хорошо, я пытаюсь выполнить вот что: у меня есть словарь с данными, которые выглядят так:

Unsorted:

US ( total population: 9 )
-New York - 4
-Miami - 5
Spain ( total population: 4 )
-Madrid - 3
-Barcelona - 1
France ( total population: 7 )
-Paris - 7

Мне нужно отсортировать словари по Странам снаибольшее население, а затем каждый город по численности населения, так что это выглядит примерно так:

Сортировка:

US ( total population: 9 )
-Miami - 5
-New York - 4
France ( total population: 7 )
-Paris - 7
Spain ( total population: 4 )
-Madrid - 3
-Barcelona - 1

У меня есть:

var worldPopulation = new Dictionary<string, Dictionary<string, long>>();

Я уже отсортировал страныиспользуя эту строку кода:

worldPopulation = worldPopulation.OrderByDescending(x => x.Value.Values.Sum()).ToDictionary(x => x.Key, x => x.Value);

Но я изо всех сил пытаюсь найти решение для сортировки вложенного словаря по странам.

Я пытаюсь сделать это с помощью одного оператора linq,но если это невозможно, будет также приветствоваться решение foreach.Спасибо!

РЕДАКТИРОВАТЬ:

@ J_L Решение было именно то, что я искал:

 worldPopulation = worldPopulation.OrderByDescending(x => x.Value.Values.Sum()).ToDictionary(x => x.Key, x => x.Value.OrderByDescending(y => y.Value).ToDictionary(y => y.Key, y => y.Value));

Решение @ Lucifer также заставило его работать:

var worldPopulationSorted = new Dictionary<string, Dictionary<string, long>>();

worldPopulation.OrderByDescending(dic => dic.Value.Values.Sum()).ToList().ForEach(x => worldPopulationSorted.Add(x.Key, x.Value.OrderByDescending(y => y.Value).ToDictionary(y => y.Key, y => y.Value)));

Я понимаю, что некоторые из вас говорят мне использовать другой подход, поэтому постараюсь использовать списки, как некоторые из вас предложили,Я также узнал некоторые новые вещи, поэтому спасибо всем за помощь.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Я думаю, это то, что вы ищете:

var worldPopulation = new Dictionary<string, Dictionary<string, long>>()
{
    {"US", new Dictionary<string, long>()
    {
        { "New York", 4 },
        { "Miami", 5 }
    }},
    {"Spain", new Dictionary<string, long>()
    {
        { "Madrid", 3 },
        { "Barcelona", 1 },
    }},
    {"France", new Dictionary<string, long>()
    {
        { "Paris", 7 },
    }},
};


worldPopulation = worldPopulation.OrderByDescending(x => x.Value.Values.Sum()).
    ToDictionary(x => x.Key, 
    x => x.Value.OrderByDescending(y => y.Value).ToDictionary(y => y.Key, y => y.Value));

foreach (var country in worldPopulation)
{
    Console.WriteLine(country.Key);
    foreach (var city in country.Value)
        Console.WriteLine("   " + city.Key + " - " + city.Value);
}

Вывод:

US Miami - 5 New York - 4 France Paris - 7 Spain Madrid - 3 Barcelona - 1

0 голосов
/ 13 июня 2018

Вот рабочий пример того, что вам нужно: -

var worldPopulationSorted = new Dictionary<string, Dictionary<string, long>>();

worldPopulation.OrderByDescending(dic => dic.Value.Values.Sum()).ToList().ForEach(x => worldPopulationSorted.Add(x.Key, x.Value.OrderByDescending(y => y.Value).ToDictionary(y => y.Key, y => y.Value)));

Пример, который я использовал: -

var worldPopulation = new Dictionary<string, Dictionary<string, long>>();

Dictionary<string, long> sample = new Dictionary<string, long>();
sample.Add("1", 5);
sample.Add("2", 6);
sample.Add("3", 7);

worldPopulation.Add("first", sample);

sample = new Dictionary<string,long>();
sample.Add("3", 9);
sample.Add("2", 9);
sample.Add("1", 9);

worldPopulation.Add("second", sample);

var worldPopulationSorted = new Dictionary<string, Dictionary<string, long>>();

worldPopulation.OrderByDescending(dic => dic.Value.Values.Sum()).ToList().ForEach(x => worldPopulationSorted.Add(x.Key, x.Value.OrderByDescending(y => y.Value).ToDictionary(y => y.Key, y => y.Value)));

вывод: -

second
   3 - 9
   2 - 9
   1 - 9
first
   3 - 7
   2 - 6
   1 - 5

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...