gpt4 book ai didi

c# - 为什么我的动态 IEqualityComparer 不起作用?

转载 作者:行者123 更新时间:2023-11-30 13:57:33 24 4
gpt4 key购买 nike

我有课

public class Foo
{
public int ID { get; set; }
}

并且我实现了 LinqEqualityComparer 以允许对 Except 扩展方法进行动态 IEqualityComparer 测试。

public class LinqEqualityComparer<T> : IEqualityComparer<T>
{
protected Func<T, T, bool> Comparison { get; set; }

public LinqEqualityComparer(Func<T, T, bool> comparison)
{
Comparison = comparison;
}

public bool Equals(T x, T y)
{
return Comparison(x, y);
}


public int GetHashCode(T obj)
{
return obj.GetHashCode();
}
}

我创建了以下代码来测试它:

IEnumerable<Foo> settings = new Foo[]
{
new Foo{ID = 1},
new Foo{ID = 2}
};
IEnumerable<Foo> currentSettings = new Foo[]
{
new Foo{ID = 1},
new Foo{ID = 2},
new Foo{ID = 3}
};
IEqualityComparer<Foo> comparer = new LinqEqualityComparer<Foo>((x, y) => x.ID == y.ID);
IEnumerable<Foo> missing = currentSettings.Except(settings, comparer);

但是 Foos 1,2 和 3 都存在于“缺失”变量中。

为什么这个 LinqEqualityComparer 不起作用?

最佳答案

因为你的相等比较器没有实现 GetHashCode正确。 GetHashCode实现必须为比较相等的元素生成相同的代码。这不会发生在这里,因为相等比较是自定义的,而哈希码不是相应生成的。

要完成这项工作,您需要做以下两件事之一:

  1. 让比较器接受散列码实现作为附加参数,即 x => x.ID.GetHashCode()并向前推进。这是最简单的,也是您在实践中应该做的。

  2. 修改GetHashCode以这种方式,它是参与比较的属性的哈希码的聚合函数(这里是 ID 属性)——单个哈希码的直接异或可以工作(即使它可能不是最佳的)。

    这留给你的问题是如何检测哪个属性进行了比较。为了能够自动回答该问题,您需要接受表达式树而不是用于比较的委托(delegate),即 Expression<Func<T, T, bool>>。然后访问表达式树以确定要做什么。这肯定不容易。

关于c# - 为什么我的动态 IEqualityComparer 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20638639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com