IEqualityComparer和Contains方法我有一个带有2个枚举字段的简单类,我试图在集合(List)中找到该对象的一个??项目,但Contains方法无法正常工作public类计算器:IEqualityComparer{publicDashboardsComputationModeComputationMode{get;放;}公共模式模式{get;放;}公共计算器(DashboardsComputationModedashboardsComputationMode,模式模式){ComputationMode=dashboardsComputationMode;,计算器y){return(x.ComputationMode.Equals(y.ComputationMode)&&x.Mode.Equals(y.Mode));}publicintGetHashCode(Calculatorobj){返回obj.ComputationMode.GetHashCode()^obj。模式.GetHashCode();}}publicenumDashboardsComputationMode{Weighted=0,Aggregated=1,PR=2,CurrentValue=3,EquivalentHours=4,AggregatedCorrected=5,PRCorrected=6}publicenumModes{InstantaneousMode=0,DailyMode=1,MonthlyMode=2,YearlyMode=5,Undefined=4,}为什么这个测试不起作用[TestMethod]publicvoidTestMethod1(){varlist=newList(){新计算器(DashboardsComputationMode.PR,Modes.DailyMode),新计算器(DashboardsComputationMode.CurrentValue,Modes.YearlyMode),新计算器(DashboardsComputationMode.PRCorrected,Modes.Month)};varitem=newCalculator(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.Contains来确定相等性)返回List这是EqualityComparer.Default工作原理的MSDN描述:Default属性检查类型T是否实现System.IEquatable接口,如果是,返回一个使用该实现的EqualityComparer。否则,它返回一个EqualityComparer,它使用T提供的Object.Equals和Object.GetHashCode的Overrides。换句话说,您的Calculator类应该实现System.IEquatable(而不是System.IEqualityComparer!)接口或覆盖Object.Equals和Object.GetHashCode方法。您不在IEqualityComparer中使用Equals并包括两者。EqualityComparer具有不同的含义。我为您更正了代码。公共类CalculatorComparer:IEqualityComparer{publicboolEquals(Calculatorx,Calculatory){return(x.ComputationMode.Equals(y.ComputationMode)&&x.Mode.Equals(y.Mode));}publicintGetHashCode(Calculatorobj){returnobj.ComputationMode.GetHashCode()^obj.Mode.GetHashCode();}}publicclassCalculator{publicDashboardsComputationModeComputationMode{get;放;}公共模式模式{get;放;}公共计算器(DashboardsComputationModedashboardsComputationMode,模式模式){ComputationMode=dashboardsComputationMode;模式=模式;}publicoverrideboolEquals(objectobj){计算器y=obj作为计算器;返回(this.ComputationMode.Equals(y.ComputationMode)&&this.Mode.Equals(y.Mode));}}publicenumDashboardsComputationMode{Weighted=0,Aggregated=1,PR=2,CurrentValue=3,EquivalentHours=4,AggregatedCorrected=5,PRCorrected=6}publicenumModes{InstantaneousMode=0,DailyMode=1,MonthlyMode=2,YearlyMode=5,Undefined=4,}现在两个都应该返回true以上就是C#学习教程分享的全部内容:IEqualityComparer和Contains方法,如果对大家有用还需要进一步了解C#学习教程,希望大家多多关注~本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
