比较两个Dictionary 的最佳方法是否相等

这是为两个字典的平等创建比较器的最佳方法吗? 这需要准确。 请注意,Entity.Columns是KeyValuePair的字典(字符串,对象):

public class EntityColumnCompare : IEqualityComparer { 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实现也不太确定。

谢谢!

这就是我要做的事情:

  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非常糟糕,如果你想在hashtable / dictionary / hashset中使用这个比较器,因为所有实例都会落在同一个桶中,导致O(n)访问而不是O(1)
  • 返回字典的Count (由digEmAll建议):它不会给出很好的分布,但仍然比总是返回相同的值更好,并且它满足GetHashCode的约束(即被认为相等的对象应该具有相同的hashcode;两个“相等”的词典具有相同数量的项目,因此它可以工作)

想到这样的事情,但可能会有更高效的东西:

 public static bool Equals(IDictionary x, IDictionary y) { return x.Keys.Intersect(y.Keys).Count == x.Keys.Count && x.Keys.All(key => Object.Equals(x[key], y[key])); } 

这对我来说似乎不错,也许不是最快但有效的。

您只需要更改错误的GetHashCode实现。

例如,您可以返回obj.Columns.Count.GetHashCode()