キーにカスタム比較を使用して、一般的な辞書から値を取得するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/8389257

質問

オブジェクトの一般的な辞書があり、辞書の値を更新するためにカスタム比較を使用したいと考えています。

myObjects オブジェクトの辞書が含まれており、値はオブジェクトが存在する回数です。値は、異なるコンパレータを使用して何度も増加するか、完全に削除される可能性があることに注意してください。

testObject 私のカスタムオブジェクトです。

customComparer TestObjectのタイプに基づいて動的に変化する比較です。しかし、すべての比較はタイプです IEqualityComparer<MyObject>

IDictionary<MyObject, int> myObjects;
var testObject;
var customComparer;

if (myObjects.Keys.Contains(testObject, customComparer))
{
    //get the value, if its > 1 then decrement the value
    //else remove the entry entirely
    //not sure how to get the value based on my custom comparer??

    //this code below does not work because it requires the custom comparer
    //var occurrences = myObjects[testObject];
    //if (occurrences > 1)
    //    myObjects[testObject]--;
    //else
    //    myObjects.Remove(testObject);
}
else
{
    myObjects.Add(testObject, 1);
}

keys.containsを使用して、オブジェクトがカスタム比較で存在するかどうかを判断できますが、値を更新する方法がわかりませんか?

役に立ちましたか?

解決 2

これについては迅速なimlpementationはありませんでした。代わりに、多数の内部平等比較を収容するラッパーiequalitycompererを作成しました。ラッパーは、比較オブジェクトからのプロパティに基づいて、適切な内部辞書の比較の適切な内部辞書を選択した等式およびGethashCodeメソッドを上書きしました。

public class WrapperComparer : IEqualityComparer<MyObject>
{
    private IDictionary<string, IEqualityComparer<MyObject>> _myComparerList;

    public bool Equals(MyObject x, MyObject y)
    {
        var comparer = _myComparerList[x.SomeProperty];
        return comparer.Equals(x, y);
    }

    public bool GetHashCode(MyObject obj)
    {
        var comparer = _myComparerList[obj.SomeProperty];
        return comparer.GetHashCode(obj);
    }
}

その後、比較は機能します...

var testObject;
var customComparer = new WrapperComparer(list of comparers here);
IDictionary<MyObject, int> myObjects = 
    new Dictionary<MyObject, int>(customComparer);

if (myObjects.ContainsKey(testObject))
{
    var occurrences = myObjects[testObject];
    if (occurrences > 1)
      myObjects[testObject]--;
    else
      myObjects.Remove(testObject);
}
else
{
    myObjects.Add(testObject, 1);
}

他のヒント

辞書を作成するときは、カスタムを提供する必要があります IEqualityComparer の中に コンストラクタ. 。辞書が構築された後、平等比較を変更することはできません。

君は できる カスタム比較に応じて一致するキーを見つけるまで、キー値のペアを反復しますが、辞書が提供する機能を利用しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top