4

そうでない場合、2 つの NameValueCollections オブジェクトが等しいかどうかを判断する最善の方法は何ですか。

namevaluecollection に解析された 2 つのクエリ文字列が、順序に関係なく同じキーと値を持っているかどうかを判断するために使用しています。

4

2 に答える 2

8

Equalsは、あなたが望むことをしていないようです。それらが同等であるということではなく、参照の同等性をチェックしているように見えます。

次の方法は (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)));
于 2012-07-28T21:59:41.027 に答える
1

コレクションのキー/値を手動で比較するヘルパー メソッドまたは同様のものを作成して、それらが必要なものと等しいかどうかを判断できるようにすることをお勧めします。

特定のケースに依存する変数がたくさんあることを覚えておいてください.コレクションの内容(キーと値)が同じで、順序が異なる場合、それらは等しいですか?内容が同じ (値が等しい) が参照が等しい場合、コレクションは等しいか、またはすべてのキーと値に対して同じインスタンスである必要がありますか? 等。

そのため、フレームワークに組み込まれているすべてのソリューションに対応できる万能のソリューションはおそらく存在しません。2 つのコレクションを、同等性を判断するために必要な基準と比較するコードを作成する必要があります。

于 2012-07-26T14:09:49.923 に答える