Dictionary vs SortedList用于数据存储和处理

时间:2014-06-26 12:35:03

标签: c# dictionary sortedlist

我创建了一个字典,包括DateTime作为Key和Value的自定义类。

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实例中的数据中)。

1 个答案:

答案 0 :(得分:2)

使用SortedDictionary<TKey, TValue> Class

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

documentation之后的问题解释了使用SortedListSortedDictionary

之间的区别
  

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)而不是   SortedList<TKey, TValue>的O(n)。

  •   
  • 如果列表是从排序数据中一次性填充的,则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();