2011-08-10 30 views
0

我有兩個充當緩存的字典,我們稱之爲d1d2,其中d2d1的子集。更新C#中的協調字典

當我用d1的新條目刷新字典時,我希望刷新d2中的條目。這是可以做到的明顯的方式:

foreach(var update in updates) { 
    d1[update.id] = update; 
    if(d2.Contains(update.id)) 
     d2[update.id] = update; 
} 

但因爲我想緩存其他子集(D3,D4,D5,等等),這可能會非常笨重。所以我添加了一個「CopyFrom」方法到我的對象,這使我可以通過簡單地將屬性複製到正在更新的對象來維護引用。

foreach(var update in updates) { 
    d1[update.id].CopyFrom(update) 
} 

這樣,當d1得到更新是必須的條目的引用任何其他字典不會失去它。

我只想知道我是否在這裏遺漏任何東西?我只是在休息之後回到C#,並且我明顯的把握可能會不穩定:)。

+2

請解釋你想要達到的目標以及你需要多個字典的地方。 – VVS

+0

基本上,我有一個非常大的字典,需要重新安排到各種「意見」。我不想對每個請求做動態的LINQ查詢(很慢),而是想緩存這些視圖。如果主字典值得到更新,我想要更新子快速存儲值。 – dcpar

+0

對於您的意見,請使用僅包含相關鍵(不含值)的列表。通過'd1 [d2 [index]]'進行查找。 – VVS

回答

2

爲什麼不能有一個CacheItem類包含有效負載(字典中的當前值)。然後,對於字典中的每個鍵,存儲包含您當前存儲的內容的CacheItem。如果將相同的CacheItem對象存儲在多個字典中,則只需修改CacheItem的有效內容,並更新包含它的所有字典。

foreach(var update in updates) { 
    if (d1.ContainsKey(update.id)) { 
     var cacheItem = d1[update.id]; 
     cacheItem.Payload = update; 
    } else { 
     d1[update.id] = new CacheItem(update); 
    } 
} 

我的回答假設你有多個字典的設計,最主要的一個部分存在子集是根據您的要求,並解決他們的聲音的方式。這對我來說似乎有點不尋常。

+0

上述評論中的非常規要求的解釋:)。感謝您的建議!我認爲淨效果與「CopyFrom」方法相同,但是更簡單一點,但CopyFrom方法允許我實現ICopyableFrom接口,併爲這些對象創建一個字典子類。 – dcpar

+0

根據您提供的附加信息,我會同意其他評論對您的問題的一般風格。也就是說,你應該將緩存的概念與視圖的概念分開。緩存應該是緩存對象的單個位置。視圖應該是緩存中的集合或引用數組,而不是迷你緩存。 – hatchet

+0

這就是意圖,儘管我曾經想將引用存儲爲查詢,而不是作爲對象引用自身。我會做一些性能測試,看看事情進展如何。 – dcpar

1

那麼,如果字典的值是一個引用類型,並且只修改它,則不需要執行任何操作。如果你正在創建一個新的引用,或者它是一個值類型,我會將子集更改爲id類型的數組,這是你想要的子集。只要你需要價值,你仍然可以去d1去訪問它。

+0

如果條目分配了'd1 [1] = o1',然後我分配'd2 [1] = d1 [1]',則複製對象'o1'的引用,而不是對條目的引用。如果我更新'd1 [1] = o2',那麼'd2 [1]'仍然指向'o1'。 – dcpar

+0

@dcpar我在說,如果你不重新分配參考。相反,如果你只做'd1 [1] .propName =「Hello World」',你可以觀察到與d2 [1]相同的改變。一般來說,你看起來有點難以維持。如果你想刪除一個對象,你必須通過所有的字典並刪除對它的引用,否則你有內存泄漏。不知道這是否是一個問題。 –

+0

你是對的,添加和刪除是肯定的這種方法的關注。這可以通過讓父字典通過工廠生成子查詢集合並附加添加/刪除事件來處理。 – dcpar