Подтвердить что ты не робот

Как отсортировать словарь по ключевым словам

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

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

Я пытаюсь сортировать его с помощью

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

но он не работает

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

4b9b3361

Ответ 1

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

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();

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

Загрузите несортированный объект в объект SortedDictionary, например:

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

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

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

Ответ 5

Следующий код использует еще два для sort словарь.

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

Ответ 6

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

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

Ответ 7

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

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

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