如何重写字典中的重复键?

时间:2014-01-27 12:05:41

标签: c# linq dictionary comparison

我需要从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 - 表示源集合(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是什么,以及它是如何运作的。或者......我不明白如何正确使用它!所以,我需要帮助。

谢谢!

2 个答案:

答案 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会比较引用而不是您希望的值。