1

SortedDicationary の Except-Function を利用しようとしていますが、期待どおりに動作しないため、気が狂っています。Excpet 関数は、ディクショナリのエントリが単純なデータ型である限り機能します。ただし、辞書にオブジェクトを保存したいと思います。

これが私のサンプルです:

 using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;


namespace DictionaryTest
{
    class Program
    {
        static void Main(string[] args)
        {

            SortedDictionary<string, Object> objects = new SortedDictionary<string, Object>();
            SortedDictionary<string, Object> objects2 = new SortedDictionary<string, Object>();




            objects.Add("A", new Object());
            objects.Add("B", new Object());
            objects2.Add("A", new Object());

            IEnumerable<KeyValuePair<string, Object>> objects_a_only = objects.Except(objects2);

            foreach (KeyValuePair<string, Object> o in objects_a_only)
            {
                Console.WriteLine(o.Key);


            }
            Console.WriteLine("Program finished. Press any key to continue");
            Console.ReadKey();


        }
    }
}

出力として「A」のみを取得することを期待していましたが、実際には「A」と「B」が返されます。

私が理解している限り、マッチングは各エントリのキーに基づいてのみ行われます。したがって、カスタマイズされた比較クラスを使用する理由はわかりません。

これに関するアイデアはありますか?

4

2 に答える 2

1

ExceptのメソッドではありませんSortedDictionary<TKey, TValue>
の拡張メソッドIEnumerable<T>です。
ソートされた辞書の場合、T実際にはKeyValuePair<TKey, TValue>です。

したがって、Exceptのインスタンスを比較しますKeyValuePair<TKey, TValue>。とが同じである場合、
の2つのインスタンスはKeyValuePair<TKey, TValue>同じであると見なされます。毎回 新しいインスタンスを作成するため、の3つのインスタンスはすべて互いに等しくないと見なされます。 コードを次のように変更することで、これを簡単に確認できます。KeyValue
objectKeyValuePair<TKey, TValue>

var o = new object();
objects.Add("A", o);
objects.Add("B", new Object());
objects2.Add("A", o);

の結果はobjects.Except(objects2)、キーを持つエントリのみになります"B"

于 2013-02-13T15:24:55.347 に答える
0

使用するEnumerable.Except場合は、デフォルトの等式比較器を使用します。この比較器は、KeyValuePairタイプに対してキーと値の両方を比較します。代わりに、このアプローチを使用できます。

IEnumerable<KeyValuePair<string, Object>> objects_a_only = objects
        .Where(kvp => !objects2.ContainsKey(kvp.Key));
于 2013-02-13T15:29:54.637 に答える