Словарь против SortedList для хранения и обработки данных

Я создал словарь, состоящий из DateTime в качестве ключа и пользовательского класса для значения.

class Class2
{
    public decimal Value1 { get; set; }
    public decimal Value2 { get; set; }
    public decimal Value3 { get; set; }
}

class TestClass
{
    public static void Main(string[] args) 
    {
        var dict = new Dictionary<DateTime, Class2>();

        dict.Add(new DateTime(2014, 6, 1), new Class2() { Value1 = 1, Value2 = 2, Value3 = 3 });
        dict.Add(new DateTime(2014, 6, 2), new Class2() { Value1 = 4, Value2 = 5, Value3 = 6 });
        dict.Add(new DateTime(2014, 6, 3), new Class2() { Value1 = 10, Value2 = 20, Value3 = 40 });
        dict.Add(new DateTime(2014, 6, 4), new Class2() { Value1 = -5, Value2 = -6, Value3 = -8 });

        // form a list consisting of Value1 and pass this list to a function for processing
    }
}

В строке комментариев я хочу выбрать некоторые конкретные точки данных для Value1 и сформировать список. Эти критерии выбора точек данных будут основаны на времени (именно поэтому мне нужно поле DateTime). Этот список будет передан другой функции для дальнейшей обработки.

Мой вопрос двоякий:

  1. Должен ли я использовать словарь для хранения такого рода данных? Я видел другие сообщения, и некоторые говорят об использовании SortedList. Данные, которые я собираюсь добавить в эти классы-контейнеры, будут располагаться в последовательном порядке (по времени).

  2. Как лучше всего создать список (из Value1)? Я мог бы создать отдельный список с нуля, но я хотел бы знать, есть ли какая-либо лучшая альтернатива, кроме этой (учитывая, что я уже сохранил данные в экземпляре Dictionary).


person Roy    schedule 26.06.2014    source источник


Ответы (1)


Используйте SortedDictionary<TKey, TValue> Class.

SortedDictionary<DateTime, Class2> dict = new SortedDictionary<DateTime, Class2>();

Следуя документации, хорошо объясняется разница между использованием SortedList и SortedDictionary

Общий класс SortedDictionary<TKey, TValue> представляет собой двоичное дерево поиска с O(log n) извлечением, где n — количество элементов в словаре. В этом отношении он похож на универсальный класс SortedList<TKey, TValue>. Два класса имеют схожие объектные модели, и оба имеют время поиска O(log n). Отличие двух классов заключается в использовании памяти и скорости вставки и удаления:

  • SortedList<TKey, TValue> использует меньше памяти, чем SortedDictionary<TKey, TValue>.

  • SortedDictionary<TKey, TValue> имеет более быстрые операции вставки и удаления несортированных данных: O(log n) по сравнению с O(n) для SortedList<TKey, TValue>.

  • Если список заполняется сразу из отсортированных данных, SortedList<TKey, TValue> работает быстрее, чем SortedDictionary<TKey, TValue>.

На ваш вопрос:

Как лучше всего создать список (из Value1)?

List<decimal> list = dict.Values.Select(r=> r.Value1).ToList();

Для вашего комментария:

как сформировать список из Values1, скажем, за последние 3 дня

List<decimal> listOfValue1 = dict.Where(r=> r.Key >= DateTime.Today.AddDays(-3) 
                                            &&  r.Key <= DateTime.Today)
                                 .Select(r=> r.Value.Value1)
                                 .ToList();
person Habib    schedule 26.06.2014
comment
Не могли бы вы подробнее рассказать о том, как сформировать список, состоящий из Values1, скажем, за последние 3 дня в приведенном выше примере? - person Roy; 26.06.2014