Как отсортировать словарь по ключу - PullRequest
28 голосов
/ 13 ноября 2011

У меня есть словарь Dictionary<string, Point>

Ключ - c1, c3, c2, t1,, t4, t2 Я хочу отсортировать их по c1, c2, c3, t1, t2, t3

Я пытаюсь отсортировать его, используя

Input.OrderBy(key => key.Key );

, но это не работает

Любая идея, как решить эту проблему

Ответы [ 7 ]

30 голосов
/ 13 ноября 2011

Input.OrderBy не сортирует словарь, он создает запрос, который возвращает элементы в упорядоченном порядке.

Возможно OrderedDictionary дает вам то, что вы хотите.

Или используйте Generic SortedDictionary

9 голосов
/ 04 мая 2015

Загрузите несортированный объект в объект SortedDictionary следующим образом:

SortedDictionary<string, string> sortedCustomerData = new SortedDictionary<string,string>(unsortedCustomerData);

Где unsortedCustomerData - тот же универсальный тип (строка словаря, строка или в вашем случае строка, точка).Он автоматически отсортирует новый объект по ключу

. Согласно msdn: SortedDictionary (IDictionary): Инициализирует новый экземпляр класса SortedDictionary, который содержит элементы, скопированные из указанного IDictionary, и использует реализацию IComparer по умолчанию для типа ключа..

5 голосов
/ 13 ноября 2011

Просто предположение, но похоже, что вы предполагаете, что он собирается отсортировать ввод. Метод OrderBy фактически возвращает упорядоченный экземпляр IOrderedEnumerable, содержащий те же значения. Если вы хотите сохранить возвращаемое значение, вы можете сделать следующее:

IOrderedEnumerable orderedInput
orderedInput = Input.OrderBy(key=>key.Key)

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

4 голосов
/ 16 января 2018

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

objectDict = objectDict.OrderBy(obj => obj.Key).ToDictionary(obj => obj.Key, obj => obj.Value);

2 голосов
/ 25 июня 2016

В следующем коде используются еще два списка с сортировки словарь.

using System;
using System.Collections.Generic;
using System.Drawing;

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            Dictionary<string,Point> r=new Dictionary<string,Point>();
            r.Add("c3",new Point(0,1));
            r.Add("c1",new Point(1,2));
            r.Add("t3",new Point(2,3));
            r.Add("c4",new Point(3,4));
            r.Add("c2",new Point(4,5));
            r.Add("t1",new Point(5,6));
            r.Add("t2",new Point(6,7));
            // Create a list of keys
            List<string> zlk=new List<string>(r.Keys);
            // and then sort it.
            zlk.Sort();
            List<Point> zlv=new List<Point>();
            // Readd with the order.
            foreach(var item in zlk) {
                zlv.Add(r[item]);
            }
            r.Clear();
            for(int i=0;i<zlk.Count;i++) {
                r[zlk[i]]=zlv[i];
            }
            // test output
            foreach(var item in r.Keys) {
                Console.WriteLine(item+" "+r[item].X+" "+r[item].Y);
            }
            Console.ReadKey(true);
        }
    }
}

Вывод приведенного выше кода показан ниже.

c1 1 2
c2 4 5
c3 0 1
c4 3 4
t1 5 6
t2 6 7
t3 2 3
0 голосов
/ 13 ноября 2011

хорошо, проверьте, это должно работать

var r = new Dictionary<string, Point>();
r.Add("c3", new Point(0, 0));
r.Add("c1", new Point(0, 0));
r.Add("t3", new Point(0, 0));
r.Add("c4", new Point(0, 0));
r.Add("c2", new Point(0, 0));
r.Add("t1", new Point(0, 0));
r.Add("t2", new Point(0, 0));
var l = r.OrderBy(key => key.Key);
var dic = l.ToDictionary((keyItem) => keyItem.Key, (valueItem) => valueItem.Value);

foreach (var item in dic)
{

    Console.WriteLine(item.Key);
}
Console.ReadLine();
0 голосов
/ 13 ноября 2011

Я использовал

var l =  Input.OrderBy(key => key.Key);

и преобразовал его в словарь

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