2014-06-26 47 views
1

我創建了一個字典,其中包含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選擇一些特定的數據點並形成一個列表。這些數據點選擇標準將基於時間(這就是爲什麼我需要日期時間字段)。該列表將被傳遞給另一個功能以進一步處理。

我的問題是雙重的:

  1. 我應該使用字典來存儲這類數據?我見過其他的帖子,有的正在討論使用SortedList。我要添加到這些容器類的數據將按照時間順序排列。

  2. 創建(Value1)列表的最佳做法是什麼?我可以從頭開始創建一個單獨的列表,但是我想知道除了這個以外是否還有其他更好的選擇(假設我已經存儲在Dictionary實例中的數據中)。

回答

2

使用SortedDictionary<TKey, TValue> Class

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

documentation以下說明以及有關使用SortedList VS SortedDictionary

SortedDictionary<TKey, TValue>泛型類之間的差別是一個二進制搜索 樹O(log n)檢索,其中n爲元素的個數 字典。在這方面,它類似於泛型類。這兩個類有類似的對象模型,並且都有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>更快。

對於你的問題:

什麼是創建名單(共值1)的最佳實踐?

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

的評論:

如何形成一個列表,包括值1,比方說,對於過去的3天

List<decimal> listOfValue1 = dict.Where(r=> r.Key >= DateTime.Today.AddDays(-3) 
              && r.Key <= DateTime.Today) 
           .Select(r=> r.Value.Value1) 
           .ToList(); 
+0

你能否詳細說明一個多一點有關如何在上面的示例中形成包含Values1的列表,例如最近3天? – Roy

+0

@RoySeto,用可能的代碼編輯了答案 – Habib