我需要从HttpContext
个集合中获取数据并将其存储在一个Dictionary
中,但我遇到了问题。如果我与KeyValuePair
已经拥有的密钥配对,我如何在Dictionary
中重写Dictionary
?
例如,我的功能:
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
- 表示源集合(QueryString
,Form
或Headers
)我的价值来自。
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 :(得分: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(...
答案 1 :(得分:0)
您需要在类KeyAndValue上覆盖Equals和GetHashCode,因为Dictionary会比较引用而不是您希望的值。