2013-04-09 38 views
7

在做這樣的事情:C#字典TryGetValue爲int值,如何避免重複查找

int value; 
if (dict.TryGetValue(key, out value)) 
{ 
    if (condition) 
    { 
     //value = 0; this copies by value so it doesn't change the existing value 
     dict[key] = 0; 
    } 
} 
else 
{ 
    dict[key] = 0; 
} 

有什麼方法可以讓我避免索引查找替換現有的價值?我已經使用TryGetValue驗證了密鑰是否存在,因此看起來像是一種浪費,不得不再次通過索引檢索值。

在另一個註釋中,與我的代碼的else {}部分一樣,在添加新值或替換舊值時使用索引器通常被認爲是很好的做法,並且添加以清楚說明您正在添加而不是替換?或者我應該每次只使用索引器?我學會了使用字典的方式,我總是做一個TryGetValue查找,並在else部分處理沒有密鑰存在的情況。

+0

你不會查找它兩次。 – 2013-04-09 13:52:26

+1

@ DanielA.White:使用索引器進行查找IIRC; p – leppie 2013-04-09 13:53:09

+1

您的(條件)是否依賴於「值」? – 2013-04-09 13:53:11

回答

4

有什麼辦法可以避免索引查找來替換現有的值嗎?

不,我知道 - 但詞典的訪問應該是非常快,除非你具有的選擇覆蓋GetHashCode不佳的自定義類。

如果因爲雙重查找而沒有看到性能問題,我會放棄它。

+0

謝謝,這不會導致性能問題,但是由於這種模式對我來說經常出現,我想我會問一次,並學習最佳的方式。 – tmakino 2013-04-09 13:59:33

0

我更喜歡爲這樣的事情定義方便擴展方法。例如:

public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue defaultValue) 
    { 
     TValue value; 
     return dictionary.TryGetValue(key, out value) ? value : defaultValue; 
    } 

    public static TValue GetOrSet<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue value) 
    { 
     return dictionary[key] = dictionary.GetValueOrDefault(key, value); 
    } 

這裏有一點需要擔心的字典哈希查找&表現 - 我主要關注的可讀性和可維護性。通過以上的擴展方法,這種事情是一個班輪:

int value = dict.GetOrSet(key, 0); 

(聲明:不執行if (condition)支票 - 我很少經歷這些場景)

0

你可以試試這個出

Object value; 
if (dict.TryGetValue(key, out value)) 
{ 
    if (condition) 
    { 
     //value.data = 0; this copies by value so it doesn't change the existing value 
     value.data = 0; 
    } 
} 
else 
{ 
    value.data = 0; 
} 

故事的本質是,你正在提取的類型是一個泛型類型,並分配在堆上。即當你取出它時,它會作爲價值出現。但是,如果您取出對象,它將是對原始分配對象的引用,您可以修改對象的特定屬性的值。