如果两个集合具有相同的键值对,NameValueCollection Equals方法是否会进行比较?

时间:2012-07-26 13:49:48

标签: c# .net

如果不是,确定两个NameValueCollections对象是否相等的最佳方法是什么。

我正在使用它来确定解析为namevaluecollection的两个查询字符串是否具有相同的键和值,而不管顺序如何。

2 个答案:

答案 0 :(得分:6)

等于似乎没有你想要的。它似乎检查引用相等,而不是它们是等价的。

以下方法应该有效(使用System.Linq),尽管可能有更有效的方法:

public bool CompareNameValueCollections(NameValueCollection nvc1,
                                        NameValueCollection nvc2)
{
    return nvc1.AllKeys.OrderBy(key => key)
                       .SequenceEqual(nvc2.AllKeys.OrderBy(key => key))
        && nvc1.AllKeys.All(key => nvc1[key] == nvc2[key]);
}

注意:如果订单很重要,可以删除OrderBy语句。如果每个键有多个值,并且无论顺序如何都需要检查值是否相等,那么最后一行可以更改为:

        && nvc1.AllKeys
               .All(key => nvc1.GetValues(key)
                               .OrderBy(val => val)
                               .SequenceEqual(nvc2.GetValues(key)
                                                  .OrderBy(val => val)));

答案 1 :(得分:1)

我建议创建一个辅助方法或类似的东西,手动比较集合的键/值,这样你就可以确定它们是否与你需要的相等。

请记住,有很多变量将取决于您的具体情况 - 如果集合具有相同的内容(键和值),但顺序不同,它们是否相等?如果内容相同(值相等),集合是否相等,但是没有引用相等,或者它们必须是所有键和值的相同实例?等

因此,框架中可能没有一个适合所有解决方案 - 您需要编写一些代码来比较两个集合与确定相等所需的标准。