Сортировка словаря, вытаскивание значения из конца и вставка его в начало

Есть такой словарь

Dictionary<string, string> langNames = new Dictionary<string, string>()
        {

            {"ru", "Русский"},
            {"en", "english"},
            {"eo","Esperanto"},
            {"fr-FR","français"},
            {"de","Deutsch"},
            {"zh","漢語"},
            {"ja","日本語"},
            {"ko","한국어"},
            {"hi","हिन्दी, हिंदी"},
            {"it","Italiano"},
            {"es","Español"},
            {"ar","العربية"},
            {"el","ελληνικά"},
            {"bn","বাংলা"},
            {"pt","Português"},
            {"uk","Українська"}

    };

И есть второй словарь с такими же ключами, но немного перемешанный

Dictionary<string, string> ShuffledLangs = new Dictionary<string, string>()

        {

            {"de","a"},
            {"zh","b"},
            {"ja","x"},
            {"ko","r"},
            {"hi","k"},
            {"it","d"},
            {"es","n"},
            {"ar","q"},
            {"el","e"},
            {"bn","b"},
            {"pt","m"},
            {"uk","n"},
            {"ru", "n"},
            {"en", "b"},
            {"eo","n"},
            {"fr-FR","n"},

    };

И нужно со вторым словарем сделать последовательно 2 действия

1)Отсортировать его так, чтобы ключи стояли как в исходном(ru,en,eo и тд)

2)Потом взять один элемент, например с ключем "es", и переместить его в начало словаря.

Итоговый результат должен быть такой

        {
            {"es","n"},
            {"ru", "n"},
            {"en", "b"},
            {"eo","n"},
            {"fr-FR","n"},
            {"de","a"},
            {"zh","b"},
            {"ja","x"},
            {"ko","r"},
            {"hi","k"},
            {"it","d"},
            {"ar","q"},
            {"el","e"},
            {"bn","b"},
            {"pt","m"},
            {"uk","n"},
           

    };

Т.к. Sort по умолчанию у словаря нет, есть вариант долгого пути, т.е. написать компаратор который будет смотреть, как высоко стоит тот или иной ключ словаря по сравнению с эталонным и возвращать +1 или -1, и в зависимости от него использовать OrderBy, но быть может это можно сделать как-нибудь более изящным LINQ-запросом?

А второй пункт тоже непонятен - у словаря нет метода Insert, т.к. нет индексов, однако перечисление его все равно возвращает в том же порядке, как он был создан. Надо как то пересоздать словарь, закинув нужную ячейку в начало при инициализаии? Или есть опять таки простой однострочный LINQ запрос который решает эту проблему?


Ответы (2 шт):

Автор решения: Potion

Можно и без компаратора и без Linq - просто двумя циклами.

  public static Dictionary<string, string> SortAsLangName(Dictionary<string, string> source, string upLocale)
        {
            Dictionary<string, string> finalDict = new Dictionary<string, string>();

            finalDict.Add(upLocale, source[upLocale]); //Кладем в свежий словарь первым предметом тот-ключ значение, который мы хотим видеть первым.
            foreach (var langName in langNames)// Проходим по словарю, где все ключи в нужном нам порядке
            {
                if (langName.Key.Equals(upLocale))
                {
                    continue;
                }
                foreach (var src in source)//Проходимся по перемешанному словарю, и если ключ исходного в этой итерации совпадает с ключем перемешенного, то добавляем ключ-значение в финальный словарь
                {
                    if (src.Key.Equals(langName.Key))
                    {
                        finalDict.Add(src.Key, src.Value);
                    }
                }
            }

            return finalDict;
        }
    

Таким образом оба условия осуществлены - первый член словаря тот, ключ мы передаем в методе, а остальные отсортированы так же как в словаре langNames

→ Ссылка
Автор решения: PashaPash

Dictionary в C# не отсортирован, не обязательно хранит пары в порядке добавления, и "порядок" в нем может поехать в любой момент. Вот простой пример:

using System;
using System.Collections.Generic;

namespace ConsoleApp16
{
    class Program
    {
        static void Main(string[] args)
        {
            var test = new Dictionary<int, string>();
            test.Add(3, "three");
            test.Add(2, "two");
            test.Add(1, "one");
            test.Add(0, "zero");

            test.Remove(2);
            test.Add(5, "five");

            foreach (var pair in test)
            {
                Console.WriteLine(pair.Key);
            }
        }
    }
}

Вместо ожидаемого вами вывода

3
1
0
5

этот код выводит на моей машине

3
5
1
0
→ Ссылка