Как поменять порядок всех значений в словаре и поменять его порядок? - PullRequest
0 голосов
/ 19 октября 2018

У меня не получается ...

У меня есть код:

Dictionary<string, string>[] dic = new Dictionary<string, string>[2];
dic[0].Add("10", "a");
dic[1].Add("20", "b");

Я должен вывести с помощью Console.Writeline:

10, b 
20, a

20, a
10, b

Это значитсначала я должен изменить значения, а затем ключ, но я не понимаю, как им управлять.Я попробовал официальный сайт Microsoft, но я не захожу дальше.

Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

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

Однако, если это всего лишь упражнение.Вы можете использовать List<T> для доступа к нему по индексу:

Dictionary<string, string> dict = new Dictionary<string, string>() {{"10", "a"}, {"20", "b"}};

List<KeyValuePair<string, string>> listDict = dict.ToList();
// 1.) switch the values, last becomes first and vice-versa
for (int i = 0; i < listDict.Count; i++)
{
    string oppositeValue = listDict[listDict.Count - 1 - i].Value;
    dict[listDict[i].Key] = oppositeValue;
}
// 2.) reverse the dictionary to "switch" the keys, this is not recommended with a dictionary, because it is not an ordered collection
dict = dict.Reverse().ToDictionary(kv => kv.Key, kv => kv.Value);
0 голосов
/ 19 октября 2018

Ваш код не будет компилироваться

Однако, может быть, вы хотите что-то вроде этого

Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("10", "a");
dic.Add("20", "b");

// Ouput
foreach (var key in dic.Keys)
   Console.WriteLine(key + " "+ dic[key]);

// Change 
dic["10"] = "C";
dic["20"] = "D";

// Ouput    
foreach (var key in dic.Keys)
   Console.WriteLine(key + " " + dic[key]);

Или, может быть, вы просто хотите список

var list = new List<(string,string)>();
list.Add(("10", "a"));
list.Add(("20", "b"));

// order one way
foreach (var item in list.OrderBy(x => x.Item1))
   Console.WriteLine(item);

// order another
foreach (var item in list.OrderByDescending(x => x.Item1))
   Console.WriteLine(item);

Вывод

10 a
20 b
10 C
20 D
(10, a)
(20, b)
(20, b)
(10, a)

Полная демонстрация здесь

...