如何在字典中重写重复键



我需要从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,以及它如何工作。或...我不明白如何正确使用它!所以,我需要帮助。

谢谢!

简单...不要使用字典,而是考虑制作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,因为字典将比较参考,而不是您想要的值。

最新更新