Question

I have a generic dictionary of objects and want to use a custom comparer to update the value in the dictionary.

myObjects contains a dictionary of objects and the value is the number of times that object exists. Note that the value may be incremented numerous times using different comparators or removed altogether.

testObject is my custom object.

customComparer is a dynamically changing comparer based on the type of testObject. but all comparers are of the type 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);
}

I can use Keys.Contains to determine if the object exists with custom comparer but then i'm not sure how to update the value?

Was it helpful?

Solution 2

There was no quick imlpementation for this. Instead, I created a wrapper IEqualityComparer that housed numerous internal equality comparers. The wrapper overwrote the Equals and GetHashCode methods which picked the appropriate internal dictionary of equality comparers based on a property from the comparison object.

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);
    }
}

Then the comparison works...

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);
}

OTHER TIPS

When you create the dictionary you should provide your custom IEqualityComparer in the constructor. You can't change the equality comparer after the dictionary is constructed.

You could iterate over the key value pairs until you find a key that matches according to your custom comparer, but then you aren't taking advantage of the features that a Dictionary provides.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top