Loading...
Vesso1980 avatar Vesso1980 486 Точки

Проблем със сортирането на вложени речници - October 2016 Exam Preparation II / 4. Roli The Coder

 

Здравейте колеги,

имам проблем със сортирането на вложени речници завършващи с вложен списък. (Dictionary<string, Dictionary<string, List<string>>>)

Искам да сортирам вътрешния речник по дължината на списъка, обаче, по начина, по който опитвам единственото нещо, което се получава е подредба по азбучен ред. Аз знам че конкретната задача може да се реши и без вложени речници, но аз искам да разбера това сортиране как се постига по принцип. Това ми е целия код - https://pastebin.com/zmBT321j , но частта която ме интересува е най вече сортирането накрая.

foreach (var item in eventList)               
            {
                foreach (var element in item.Value.OrderByDescending(x => x.Value.Count))
                {
                    Console.WriteLine($"{element.Key.ToString().Substring(1)} - {element.Value.Count}");
                    foreach (var participant in element.Value)
                    {
                        Console.WriteLine(participant);
                    }

                }

 

Благодаря предварително!

Тагове:
0
Programming Fundamentals
k.sevov avatar k.sevov 1077 Точки
Best Answer

Сортирането както си го направил си работи за вътрешния речник, но той винаги е с по един елемент вътре (всяко ID има само един event) и затова няма ефект. Елементите за сортиране са ти във външния и трябва да ги подредиш там, което ако държиш да е с вложена структура може да стане с OrderByDescending(x => x.Value.First().Value.Count). Разбира се, винаги когато ще имаш само по един елемент в речник, то от речника всъщност няма нужда. Това ще работи за конкретната задача, но ако имахме много елементи във вътрешния и примерно искаме да сортираме по максималната дължина на един от техните списъци би трябвало да може да стане с OrderByDescending(x => x.Value.Max(y => y.Value.Count)).

P.S. Всъщност при твоя код не винаги имаш само по един елемент във вътрешния, но би трябвало да е така по условие - разгледай случаите, в които ID се повтаря.

0
Vesso1980 avatar Vesso1980 486 Точки

Да, много благодаря за подробното разяснение, получи се по този начин! Няма да ти кажа, що време изгубих из нета да търся как става това. Трябваше по-рано да се сетя за форума. . .

0
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки

сорри но не разбирам въпроса ти? искаш да подредиш списъците или тоест list<string> по -list.lenght? така ли ?

това сортиране което си написал работи нормално както си го написал то ти ги подрежда по азбучен ред. Ти подреждаш вътрешния речник по ключа му стринг. Ако искаш по стойноста на вътрешния речник ще е нещо от сорта на

OrderByDescending(x => x.Value.Value.Count))

0
Vesso1980 avatar Vesso1980 486 Точки

Съжалявам, че не съм бил достатъчно ясен. Направо ще дам конкретне пример за да се онагледи каква ми е идеята. 

Получавам тези данни като вход - 

1 #Beers @roli @trophon @alice

2 #GameDevMeetup @sino @valyo

3 #Karaoke @nakov @royal @ROYAL @ivo

Номерата 1,2,3 са ми ключовете на външния речник, думите започващи с # са ми ключовете на вътрения а думите започващи с @ ги вкарвам в списъка на вътрешния речник.

И за изход трябва да отпечатам ключовете на вътрения речник подредени по дължина на списъка. 

Или трябва да изглежда така :

Karaoke - 4
@ivo
@nakov
@royal
@ROYAL

Beers - 3
@alice
@roli
@trophon
GameDevMeetup - 2
@sino
@valyo
 

 А при мен излизат по азбучен ред, вместо по брой неща в списъка:

Beers - 3
@alice
@roli
@trophon
GameDevMeetup - 2
@sino
@valyo
Karaoke - 4
@ivo
@nakov
@royal
@ROYAL

Опитах и с OrderByDescending(x => x.Value.Value.Count)), обаче не ми позволява да напиша второто value, подчертава го в червено.

0
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки

не разбрал съм те перфектно просто, беше малко объркващо на писано x.value.length? след като си с списък.A и можеш ли да кажеш x.value.values? каква грешка ти хвърля?

 

https://stackoverflow.com/questions/43549323/how-to-sort-by-descending-nested-dictionary-in-c-sharp-using-linq

https://stackoverflow.com/questions/32901570/sort-2-dictionaries-linq-c-sharp

0
Vesso1980 avatar Vesso1980 486 Точки

Ами да всъщност стана и с values, но трябва да е в този вид към външния речник. 

OrderByDescending(x => x.Value.Values.Sum(y => y.Count))

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.