首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IEqualityComparer和Contains方法

IEqualityComparer和Contains方法
EN

Stack Overflow用户
提问于 2013-01-29 18:21:56
回答 2查看 40.5K关注 0票数 18

我有一个包含这两个枚举字段的简单类,我试图在一个集合(List<T>)中查找该对象的一项,但Contains方法不能正常工作

代码语言:javascript
复制
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,
}

为什么这个测试不起作用?

代码语言:javascript
复制
[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));
}

第一个断言工作正常

代码语言:javascript
复制
Assert.IsTrue(list[1].Equals(item)) 

但第二个不是

代码语言:javascript
复制
Assert.IsTrue(list.Contains(item));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-29 18:45:15

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

以下是关于EqualityComparer.Default工作原理的MSDN解释:

默认属性检查类型T是否实现了System.IEquatable接口,如果实现了,则返回使用该实现的EqualityComparer。否则,它将返回一个使用T提供的Object.EqualsObject.GetHashCode重写的EqualityComparer

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

票数 24
EN

Stack Overflow用户

发布于 2013-01-29 18:45:01

您没有在Equals中使用IEqualityComparer<Calculator>,而是同时包含两者。EqualityComparer具有不同的意义。我帮你改正了代码。

代码语言:javascript
复制
  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。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14580595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档