【发布时间】:2018-02-19 08:15:45
【问题描述】:
我想要一个自定义相等比较器IEnumerables。使用 @PaulZahra 的 code,我创建了以下类:
class CustomEqualityComparer<T> : IEqualityComparer<IEnumerable<T>>
{
public bool Equals(IEnumerable<T> x, IEnumerable<T> y)
{
var enumerables = new Dictionary<T, uint>();
foreach (T item in x)
{
enumerables.Add(item, 1);
}
foreach (T item in y)
{
if (enumerables.ContainsKey(item))
{
enumerables[item]--;
}
else
{
return false;
}
}
return enumerables.Values.All(v => v == 0);
}
public int GetHashCode(IEnumerable<T> obj) => obj.GetHashCode();
}
问题是如果T 本身是IEnumerable,那么ContainsKey 将检查引用相等,而这个相等比较器的重点是检查值相等在任何给定深度强>.
我想改用.Keys.Contains(),因为它可以接受IEqualityComparer 作为参数:
if (enumerables.Keys.Contains(item, this)) // not sure if "this" or a new object
但我收到以下错误(CS1929):
'Dictionary.KeyCollection' 不包含'Contains' 的定义,并且最佳扩展方法重载'Queryable.Contains(IQueryable, T, IEqualityComparer)' 需要'IQueryable' 类型的接收器
我不确定如何处理这个问题。如何解决?谢谢。
编辑:请注意,此比较器不关心顺序。
【问题讨论】:
-
旁注:多次迭代
IEnumerable的成本可能非常高(即每次都读取一个大文件中的所有行) - 确保您了解限制并确实需要它。 -
@AlexeiLevenkov 谢谢!我还能如何比较它们?
-
不应该
Equals公开吗? -
@FaizanRabbani - 是的。已编辑,谢谢。
-
你的
GetHashcode是错误的,它不会为相等的枚举返回相同的哈希
标签: c# iequalitycomparer