2012-07-08 48 views
2

有沒有辦法寫這個更緊湊?緊湊的詞典鍵查找

return _searchRedirectionMap.ContainsKey(query) ? _searchRedirectionMap[query] : ""; 

Givent是_searchRedirectionMap定義爲IDictionary<string,string>

+0

重複:http://stackoverflow.com/questions/2601477/dictionary-returning-a-default-值 - 如果該鍵不存在 – 2012-07-08 12:58:33

+0

你有沒有設法回答你的問題@羅曼? :) – Richard 2012-08-07 22:17:27

回答

6

你可以寫,它利用TryGetValue方法上IDictionary擴展方法:

public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> source, TKey key, TValue defaultValue) 
{ 
    TValue outValue; 
    if (source.TryGetValue(key, outValue)) 
    { 
     return outValue; 
    } 

    return defaultValue; 
} 

,然後你可以使用這樣的:

return _searchRedirectionMap.GetValueOrDefault(query, string.Empty); 
+0

它真的很遺憾,在IDictionary 中沒有定義,因爲這會使一些if-else結構過時。這反過來使代碼在大多數情況下更具可讀性...... – 2012-07-08 12:52:01

+1

這是一個有點特定的問題(關閉我的頭頂,我想不出一點代碼在我的項目中會使用默認值,如果它不在字典中;通常如果它不在那裏,我需要做一些完全不同的事情),並且它的性能缺點是'defaultValue'必須被獲取/執行/解析並傳遞到方法中,即使字典確實包含密鑰。但是這就是擴展方法的用途:如果你需要這種方法,因爲你使用它很多?沒問題!我認爲它應該在BCL中值得商榷。 – 2012-07-08 12:57:40

+0

@ChrisSinclair實際上,一個相當有用的模式是一個字典,它在第一次訪問時爲缺失的鍵插入一個默認值,這樣可以避免默認值被重新創建的次數超過必要值。 (例如做一個頻率計數)。不確定是否有這種情況需要在BCL中進行,但爲了一個理智的API,你需要一個單獨的類來代替擴展。 – millimoose 2012-07-08 13:22:30

0

您可以使用TryGetValue方法,但它會返回null爲string類型:

_searchRedirectionMap.TryGetValue(key, out value); 

文檔:MSDN

+0

如果關鍵字不存在但不修改''out''參數 – 2012-07-08 12:50:19

+2

@PhilipDaubmeier錯誤,它返回給定類型的缺省值,它對'string'返回'null'。檢查我的回答中的鏈接 – Adam 2012-07-08 12:54:27

+0

@PhilipDaubmeier它確實返回'null'('value = default(TValue)',所以在'string'的情況下爲'null'),因爲在方法返回之前,out參數必須賦值。 – 2012-07-08 12:54:30