2014-01-27 70 views
0

我需要從HttpContext收集數據並將其存儲在一個Dictionary,但我有一個問題。如果我遇到與Dictionary已有的密鑰配對,如何在Dictionary中重寫KeyValuePair如何重寫字典中的重複鍵?

例如,我的功能:

private static IDictionary<string, object> FromNameValueCollection(NameValueCollection rq) 
{ 
return (from string query in rq 
     select new KeyAndValue { Key = query, Value = (object)rq[query] }) 
     .ToDictionary(ExtractKey, ExtractValue, StringComparer.InvariantCultureIgnoreCase); 
} 

KeyAndValue是我的特殊類是什麼樣子KeyValuePair,但它有場CollectionName - 表示源集合(QueryStringFormHeaders)我的價值的來源。

class KeyAndValue 
{ 
    public string Key { get; set; } 

    public object Value { get; set; } 

    public string CollectionName { set; get; } 
} 

而且

private static string ExtractKey(KeyAndValue kvp) 
{ 
    return (string.IsNullOrEmpty(kvp.Key) ? kvp.ColName : kvp.Key); 
} 

private static string ExtractValue(KeyAndValue kvp) 
{ 
    return kvp.Value; 
} 

我懷疑,我不明白什麼是StringComparer.InvariantCultureIgnoreCase,以及它是如何工作的。或者...我不明白如何正確使用它!所以,我需要幫助。

謝謝!

+0

字典的全部目的是它的密鑰是唯一的。使用帶有List值的字典,例如'Dictionary >'。 –

+0

@RedSerpent這就是爲什麼我使用字典。但我的來源是'NameValueCollections',正如我所說的。 'ILookUp'對我不好。我的輸出數據只能是'Dictionary '。 – Matterai

+0

'StringComparer.InvariantCultureIgnoreCase'完全按照它所宣稱的:以忽略大小寫的語言相關方式比較字符串,但不適合在任何特定文化中顯示。它的主要應用是以不同文化相同的方式排列字符串。 (http://msdn.microsoft.com/library/z3e2ccx2.aspx)。 –

回答

0

你需要重寫你的類KeyAndValue的Equals和GetHashCode因爲該詞典將比較引用而不是您希望的值。

+0

你是對的。謝謝! – Matterai

3

簡單...不要使用字典,而應考慮改爲使用ILookup。它與字典非常相似,只是它允許針對一個密鑰存儲多個值。所以......

(from string query in rq 
    select new KeyAndValue { Key = query, Value = (object)rq[query] }) 
    .ToLookup(ExtractKey, ExtractValue, StringComparer.InvariantCultureIgnoreCase); 

考慮您的意見,有點預過濾採取只對特定的鍵的最後一個值的...

rq.Select(query => new KeyAndValue { Key = query, Value = (object)rq[query] }) 
    .GroupBy(kav => kav.Key) 
    .Select(g => new KeyAndValue {Key = g.Key, Value = g.Last()}) 
    .ToDictionary(... 
+0

我需要嚴格相關的對,所以我的輸出數據只能是'IDictionary '。我問**如何**重寫**'KeyValuePair'在當前字典 – Matterai

+0

@Matterai那麼,你如何建議處理你的重複鍵?字典無法處理這一點。這是1個關鍵,1個值。這是一本字典。要麼你必須拋開價值,要麼以另一種方式處理。 – spender

+0

如果我在字典對中遇到同一個密鑰,我想寫新值,那就是我想要的=) – Matterai