1

2 つの辞書があり、それらを比較したいと考えています。大文字と小文字を区別せず、値が異なる場合にのみ false を返します。これが私のコードです。

var dic1 = new Dictionary<String, String>(StringComparer.CurrentCultureIgnoreCase);
            dic1.Add("Key 2", "Value 2");
            dic1.Add("Key 1", "Value 1"); 


            var dic2 = new Dictionary<String, String>(StringComparer.CurrentCultureIgnoreCase);
            dic2.Add("Key 1", "Value 1");
            dic2.Add("Key 2", "Value 2");

            var areEqual = dic1.OrderBy(r => r.Key).SequenceEqual(dic2.OrderBy(r => r.Key));

            Console.WriteLine(areEqual);

ご覧のとおり、ディクショナリ クラスの SequenceEqual メソッドを使用して 2 つのディクショナリを比較しています。キーの位置が異なっても結果が偽にならないように、キーで並べ替えました。私が理解できない問題は、キーと値の大文字と小文字を区別せず、値が異なる場合にのみ false を返す方法です。私の場合、値 1 と VALUE 1 はどちらも等しく、結果は true になるはずです。それはここでは私の場合ではありません。

4

4 に答える 4

2

キーで並べ替え、値を選択し、with のオーバーロードを使用しSequenceEqualますStringComparer.OrdinalIgnoreCase

 bool areEqual = dic1.OrderBy(x => x.Key).Select(kv => kv.Value)
  .SequenceEqual(dic2.OrderBy(x => x.Key).Select(kv => kv.Value), StringComparer.OrdinalIgnoreCase);

strcmpこれらは、基本的にシンボリック文字列の言語解釈によるバグを回避するだけでなく、より優れたパフォーマンスを提供するのと同様のバイト単位の比較を強制します。

http://msdn.microsoft.com/en-us/library/ms973919.aspx

于 2013-09-27T07:03:14.407 に答える
1

カスタム比較子を使用して値を比較することになりました。これがコードです。

class Program
    {
        static void Main(string[] args)
        {
            var dic1 = new Dictionary<String, String>();
            dic1.Add("Key 2", "Value 2");
            dic1.Add("Key 1", "Value 1"); 


            var dic2 = new Dictionary<String, String>();
            dic2.Add("Key 1", "Value 1");
            dic2.Add("Key 2", "Value 2");

            var areEqual = dic1.OrderBy(r => r.Key).SequenceEqual(dic2.OrderBy(r => r.Key), new ProductComparer());

            Console.WriteLine(areEqual);

            Console.ReadLine();
        }
    }



    internal class ProductComparer : IEqualityComparer<KeyValuePair<string, string>>
    {
        public bool Equals(KeyValuePair<string, string> x, KeyValuePair<string, string> y)
        {
            Boolean areEqual = (String.Compare(x.Key, y.Key, StringComparison.OrdinalIgnoreCase) == 0) && (String.Compare(x.Value, y.Value, StringComparison.OrdinalIgnoreCase) == 0);
            return areEqual;
        }

        public int GetHashCode(KeyValuePair<string, string> obj)
        {
            return obj.GetHashCode();
        }
    }
于 2013-09-27T07:00:01.237 に答える
0

まず、長さを確認します。等しくない場合は false を返します。

次に、各メンバーを繰り返し処理し、値を比較します (順序が同じであると仮定します)。最初のディクショナリを反復処理し、各要素が 2 番目のディクショナリにあるかどうかを確認することによっても、これを行うことができます。そうでない場合は、ループから抜け出すか、false を返します。

于 2013-09-27T06:35:58.470 に答える