Сортировка словаря, вытаскивание значения из конца и вставка его в начало
Есть такой словарь
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 шт):
Можно и без компаратора и без 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
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