IEqualityComparer和Contains方法

我有这个简单的类与2个枚举字段,我试图在集合( List )中找到此对象的一个​​项目但是Contains方法无法正常工作

 public class Calculator : IEqualityComparer { public DashboardsComputationMode ComputationMode { get; set; } public Modes Mode { get; set; } public Calculator(DashboardsComputationMode dashboardsComputationMode, Modes mode) { ComputationMode = dashboardsComputationMode; Mode = mode; } public bool Equals(Calculator x, Calculator y) { return (x.ComputationMode.Equals(y.ComputationMode) && x.Mode.Equals(y.Mode)); } public int GetHashCode(Calculator obj) { return obj.ComputationMode.GetHashCode() ^ obj.Mode.GetHashCode(); } } public enum DashboardsComputationMode { Weighted = 0, Aggregated = 1, PR = 2, CurrentValue = 3, EquivalentHours = 4, AggregatedCorrected = 5, PRCorrected = 6 } public enum Modes { InstantaneousMode = 0, DailyMode = 1, MonthlyMode = 2, YearlyMode = 5, Undefined = 4, } 

为什么可能这个测试不起作用

 [TestMethod] public void TestMethod1() { var list = new List() { new Calculator(DashboardsComputationMode.PR, Modes.DailyMode), new Calculator(DashboardsComputationMode.CurrentValue, Modes.YearlyMode), new Calculator(DashboardsComputationMode.PRCorrected, Modes.MonthlyMode) }; var item = new Calculator(DashboardsComputationMode.CurrentValue, Modes.YearlyMode); Assert.IsTrue(list[1].Equals(item)); Assert.IsTrue(list.Contains(item)); } 

第一个断言工作正常

 Assert.IsTrue(list[1].Equals(item)) 

但第二个没有

 Assert.IsTrue(list.Contains(item)); 

List.Contains通过使用默认的相等比较器( EqualityComparer.Default返回的List.Contains来确定相等性。

以下是关于EqualityComparer.Default如何工作的MSDN说明:

Default属性检查类型T是否实现System.IEquatable接口,如果是,则返回使用该实现的EqualityComparer 。 否则,它返回一个EqualityComparer ,它使用由T提供的Object.Equals和Object.GetHashCode的覆盖。

换句话说,您的Calculator类应该实现System.IEquatable ( 而不是 System.IEqualityComparer !)接口或覆盖Object.Equals和Object.GetHashCode方法。

您没有在Equals中使用IEqualityComparer并且包含两者。 EqualityComparer具有不同的意义。 我为你纠正了代码。

  public class CalculatorComparer : IEqualityComparer { public bool Equals(Calculator x, Calculator y) { return (x.ComputationMode.Equals(y.ComputationMode) && x.Mode.Equals(y.Mode)); } public int GetHashCode(Calculator obj) { return obj.ComputationMode.GetHashCode() ^ obj.Mode.GetHashCode(); } } public class Calculator { public DashboardsComputationMode ComputationMode { get; set; } public Modes Mode { get; set; } public Calculator(DashboardsComputationMode dashboardsComputationMode, Modes mode) { ComputationMode = dashboardsComputationMode; Mode = mode; } public override bool Equals(object obj) { Calculator y = obj as Calculator; return (this.ComputationMode.Equals(y.ComputationMode) && this.Mode.Equals(y.Mode)); } } public enum DashboardsComputationMode { Weighted = 0, Aggregated = 1, PR = 2, CurrentValue = 3, EquivalentHours = 4, AggregatedCorrected = 5, PRCorrected = 6 } public enum Modes { InstantaneousMode = 0, DailyMode = 1, MonthlyMode = 2, YearlyMode = 5, Undefined = 4, } 

现在两者都应该返回true。