我有这个带有2个枚举字段的简单类,我试图在集合中找到该对象的一个项目(List<T>
),但是Contains方法无法正常工作
public class Calculator : IEqualityComparer<Calculator>
{
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<Calculator>()
{
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));
答案 0 :(得分:22)
List<T>.Contains
使用默认的相等比较器(EqualityComparer<T>.Default
返回的那个)来确定相等性。
以下是关于EqualityComparer<T>.Default
如何运作的MSDN说明:
Default属性检查类型T是否实现了 System.IEquatable接口,如果是,则返回一个 使用该实现的EqualityComparer。否则,它 返回使用覆盖的EqualityComparer 由T。
提供Object.Equals和Object.GetHashCode
换句话说,您的Calculator
课程应该实施System.IEquatable(不 System.IEqualityComparer
!)界面或覆盖Object.Equals和Object.GetHashCode方法。
答案 1 :(得分:5)
您没有在等号中使用IEqualityComparer<Calculator>
并且包含两者。 EqualityComparer
具有不同的意义。我为你更正了代码。
public class CalculatorComparer : IEqualityComparer<Calculator>
{
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。