我有一个通用的对象字典,想要使用自定义比较器来更新字典中的值。
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来确定对象是否存在自定义比较器但是我不确定如何更新该值?
答案 0 :(得分:4)
创建字典时,您应在constructor中提供自定义IEqualityComparer
。在构造字典后,您无法更改相等比较器。
你可以遍历键值对,直到根据自定义比较器找到匹配的键,但是你没有利用Dictionary提供的功能。
答案 1 :(得分: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);
}