Сортировка словаря по значению, которое является объектом с DateTime - PullRequest
1 голос
/ 26 августа 2011

У меня есть структура Test, которую я добавляю в качестве значения в словарь.Что я хочу сделать, это отсортировать словарь по DateTime значения.

    struct Test
    {
        DateTime dt;
        public string ID;
    }

    Dictionary<String, Test> dict = new Dictionary<String,Test>();
    Test t = new Test();

    t.dt = DateTime.Now;
    t.ID = "XUDF";
    dict.Add(t.ID, t);

    t.dt = DateTime.Now.AddDays(17);
    t.ID = "RFGT";
    dict.Add(t.ID, t);

    t.dt = DateTime.Now.AddDays(3);
    t.ID = "ADLV";
    dict.Add(t.ID, t);

    t.dt = DateTime.Now.AddHours(2);
    t.ID = "SKFU";
    dict.Add(t.ID, t);

Я не уверен, что делать после этого.Кроме того, это лучший способ сделать это?Я использую .net 3

Я пытаюсь создать список, к которому я могу получить доступ по идентификатору, но также упорядоченный по дате / времени в t.dt.Я хочу иметь возможность выбирать объект по его идентификатору, но также иметь возможность перебирать и выводить его в порядке даты и времени.

Ответы [ 3 ]

3 голосов
/ 26 августа 2011

Что вы подразумеваете под «сортировать словарь»?В словаре нет «порядка», как такового.Это коллекция ключей, базовой реализацией которой является хеш-таблица.

Я предполагаю, что вы хотели сказать: «Я хочу перечислить содержимое словаря в порядке значений».Это можно сделать следующим образом:

public void List( Dictionary<string,DateTime> dict )
{
  int i = 0 ;
  foreach( KeyValuePair<string,DateTime> entry in dict.OrderBy( x => x.Value ).ThenByDescending( x => x.Key ) )
  {
    Console.WriteLine( "{0}. Key={1}, Value={2}" , ++i , entry.Key , entry.Value ) ;
  }
  Console.WriteLine( "The dictionary contained a total of {0} entries." , i ) ;
}

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

2 голосов
/ 26 августа 2011

Словарь по своей природе не отсортирован.Существуют отсортированные реализации IDictionary, но обычно они сортируются по ключу, а не по значению (или атрибутам значения).Если вам нужны значения, отсортированные по полю dt значения, вы можете сделать что-то вроде:

var valuesSorted = dict.Values.OrderBy(v=>v.dt);

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

0 голосов
/ 26 августа 2011

Исходя из вашего вопроса и, как отмечали другие, словари не сортируются, поэтому единственный логичный способ вернуть отсортированный словарь - это действительно вернуть отсортированный IEnumerable<KeyValuePair<String, Test>>. И сделать это легко.

var query =
    from kvp in dict
    orderby kvp.Value.dt
    select kvp;

Вы можете легко изменить выражение select, чтобы оно возвращало часть значения KeyValuePair<,> или вместо этого возвращало анонимный тип.

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