2009-09-01 38 views
1

我已經創建了一個從SortedDictionary繼承一個新的類:應對變化的SortedDictionary

public partial class ListIncomeWeight : SortedDictionary<string, double> { 
    public Guid Identity { get; set; } 
} 

此列表與數十個其他列表,在其他列表將跟蹤如果他們合併已經用這個列表計算出來了。爲此,他們使用一個字典存儲結果,如果它之前計算。

身份背後的邏輯是,它將在其他計算中使用時唯一標識列表。這樣,當我重複計算時,我首先檢查GUID,看看我是否已經計算過它。如果是這樣,我已經知道這個計算的結果,並且可以通過不必再次循環這個列表來節省一些時間。 (計算複雜,我需要做很多工作,所以儘管每次計算的計算結果都很小,但它確實節省了時間。)

但是,當我創建列表時,會添加一些項目,計算,再添加一些項目並重新計算?在這種情況下,我不會得到預期的結果,因爲計算從未使用過新項目。所以我需要解決這個問題。

我的想法很簡單:每當添加或刪除項目時更改GUID。當然,我可以重寫添加/刪除方法,但我想要更通用的東西。是否有一些代表或事件可用於響應此列表中的更改?


一些進一步的解釋... 我有兩組列表。一套清單包含了某人收入的概覽。 (薪水,準備金,利息,儲蓄賬戶的利息等)第二組清單爲每種類型的收入定義了權重因子。這是一個規則集,告訴我薪水爲100%,但只規定爲75%等。這些權重列表將在應用權重因子後添加所有內容,從而產生最終金額。

我必須處理來自個人及其伴侶的收入,加上退休前後的收入。加上不依賴退休的收入。因此,我有大約6個人均收入清單。

我也有幾十個重量表。這些被大約1600種不同的產品所使用,最壞的情況是我必須做50萬次計算。我需要減少這個數字,因此我需要很多優化。這只是這些優化的一部分。

一般來說,我需要將收入清單和權重列表結合起來,從而得到一些值。其中一個用於查找,另一個用於計算一個人每年可以花多少錢購買產品的成本,而另一個則是對這個數量的修正。還有一些我需要考慮的收入/重量組合,但總的來說,這取決於計算本身。這個計算也使用了一個利率,這個利率變化很大,儘管它往往在一個短的範圍內。我已經通過計算不同的利率來優化該部分。但是現在我想減少計算這些加權收入所需的計算次數。幸運的是,我應該能夠將計算次數從50萬減少到幾千次,甚至更少。

這就是爲什麼我想知道這個重量列表中的值是否已被添加或刪除。發生這種情況時,它會變成不同的列表,因此它需要一個不同的GUID。我正在研究一個通用的類庫,並且對如何使用它沒有太多的控制,所以我需要確保其他開發人員不能以某種錯誤的方式使用它。這就是爲什麼這個功能是真正有用的原因。

回答

1

我認爲你必須通過在列表更改(添加,刪除,清除)時更新Guid,甚至有點改寫你的ListIncomeWeight類。我已經設置了一個標誌,告訴內部列表是否更改。身份屬性根據此標誌更新。爲什麼不還創建此事件:Changed

public partial class ListIncomeWeight : SortedDictionary<string, double> 
{ 
    public delegate void ChangedHandler(); 
    public event ChangedHandler Changed; 

    private Guid _guid; 
    private bool _changed = false; 

    private void RaiseChanged() 
    { 
     _changed = true; 
     if (Changed != null) Changed(); 
    } 

    public new void Add(string key, double value) 
    { 
     base.Add(key, value); 
     RaiseChanged(); 
    } 

    public new void Clear() 
    { 
     base.Clear(); 
     RaiseChanged(); 
    } 

    public new bool Remove(string key) 
    {    
     bool res = base.Remove(key); 

     RaiseChanged(); 

     return res; 
    } 

    public Guid Identity 
    { 
     get 
     { 
      if (_changed) 
      { 
       _guid = new Guid(); 
       _changed = false; 
      } 
      return _guid; 
     } 
     set { 
      _guid = value; 
     } 
    }   
} 
+0

是的,這恰好是我的替代解決方案...... – 2009-09-01 14:56:53

1

我不認爲有任何通用的方式來獲得回調變化。另一方面,我迷失了你的邏輯 - 你使用一個GUID來識別一個獨特的計算,但是你改變這個計算(改變字典的結果)?添加新項目時,使用新的GUID創建字典的副本不會更容易嗎? (對不起,我真的不明白它是如何工作的)

+0

添加一些文字到Q.但基本上,我有兩套名單,我需要任何列表從集合A與任何單從集B結合起來,在列表B中記住這個結果。 – 2009-09-01 11:14:05

+0

當我添加一個值時添加列表的副本是可能的。不幸的是,這些值總是被逐個添加,因此我可能會得到一個類似副本的巨大列表。 (是的,是什麼讓列表內的列表變得複雜......) – 2009-09-01 11:16:58