0

我有一个通用的对象字典,并希望使用自定义比较器来更新字典中的值。

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 来确定对象是否存在自定义比较器,但是我不确定如何更新值?

4

2 回答 2

4

当您创建字典时,您应该IEqualityComparer构造函数中提供您的自定义。构建字典后,您无法更改相等比较器。

可以遍历键值对,直到找到根据您的自定义比较器匹配的键,但是您没有利用字典提供的功能。

于 2011-12-05T17:27:47.053 回答
1

对此没有快速的实施。相反,我创建了一个封装器 IEqualityComparer,其中包含许多内部相等比较器。包装器覆盖了 Equals 和 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);
}
于 2011-12-06T13:43:50.803 回答