我需要从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
-指示源集合( 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
,以及它如何工作。或...我不明白如何正确使用它!所以,我需要帮助。
谢谢!
简单...不要使用字典,而是考虑制作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(...
您需要在类keyandValue上覆盖和gethashcode,因为字典将比较参考,而不是您想要的值。