这是为两个词典的相等性创建比较器的最佳方法吗?这需要准确。请注意,Entity.Columns是KeyValuePair的字典(字符串,对象):
public class EntityColumnCompare : IEqualityComparer<Entity>
{
public bool Equals(Entity a, Entity b)
{
var aCol = a.Columns.OrderBy(KeyValuePair => KeyValuePair.Key);
var bCol = b.Columns.OrderBy(KeyValuePAir => KeyValuePAir.Key);
if (aCol.SequenceEqual(bCol))
return true;
else
return false;
}
public int GetHashCode(Entity obj)
{
return obj.Columns.GetHashCode();
}
}
对GetHashCode实现也不太确定。
谢谢!
答案 0 :(得分:8)
这就是我要做的事情:
public bool Equals(Entity a, Entity b)
{
if (a.Columns.Count != b.Columns.Count)
return false; // Different number of items
foreach(var kvp in a.Columns)
{
object bValue;
if (!b.Columns.TryGetValue(kvp.Key, out bValue))
return false; // key missing in b
if (!Equals(kvp.Value, bValue))
return false; // value is different
}
return true;
}
这样您就不需要对条目进行排序(这是 O(n log n)操作):您只需要枚举第一个字典中的条目( O (n))并尝试按第二个字典中的键检索值( O(1)),因此总体复杂度为 O(n)。
另请注意,您的GetHashCode
方法不正确:在大多数情况下,它会为不同的字典实例返回不同的值,即使它们具有相同的内容。如果哈希码不同,Equals
永远不会被调用...你有几个选项可以正确实现它,没有一个是理想的:
GetHashCode
需要快速Equals
:如果你想在哈希表/字典/哈希集中使用这个比较器,非常不好,因为所有实例都会掉线在同一个存储桶中,导致 O(n)访问而不是 O(1) Count
(由digEmAll建议):它不会给出很好的分布,但仍然比总是返回相同的值更好,并且它满足GetHashCode
的约束(即被认为相等的对象应该具有相同的哈希码;两个“相等”的词典具有相同数量的项目,因此它可以工作)答案 1 :(得分:2)
想到这样的事情,但可能会有更高效的事情:
public static bool Equals<TKey, TValue>(IDictionary<TKey, TValue> x,
IDictionary<TKey, TValue> y)
{
return x.Keys.Intersect(y.Keys).Count == x.Keys.Count &&
x.Keys.All(key => Object.Equals(x[key], y[key]));
}
答案 2 :(得分:1)
这对我来说似乎不错,也许不是最快但有效的。
您只需要更改错误的GetHashCode
实施。
例如,您可以返回obj.Columns.Count.GetHashCode()