C#学习教程:使用Linq与自定义IEqualityComparer相交一个包含好的值(我们称它为“好”),另一个包含默认值(先生“默认”)。我希望union的交集介于good和default以及default之间。换句话说:相交(联合(好,默认),默认)。有人可能认为它解析为默认值,但这就是它变得棘手的地方:我使用自定义IEqualityComparer。我得到了以下课程:classMyClass{publicstringMyString1;公共字符串MyString2;公共字符串MyString3;}classMyEqualityComparer:IEqualityComparer{publicboolEquals(MyClassitem1,MyClassitem2){if(item1==null&&item2==null)返回真;elseif((item1!=null&&item2==null)||(item1==null&&item2!=null))returnfalse;返回item1.MyString1.Equals(item2.MyString1)&&item1.MyString2。等于(item2.MyString2);}publicintGetHashCode(MyClassitem){returnnew{item.MyString1,item.MyString2}.GetHashCode();以下是我的Good和Default系列的特点:Default:这是一个很大的集合,包含所有你想要的{MyString1,MyString2}对,但你可以猜到,MyString3值是默认值。好处:它是一个较小的集合,主要包含默认集合中的项目,但具有一些不错的MyString3值。它还有一些{MyString1,MyString2}不在想要的集合中。我想做的是:只获取Good中的默认项,而将Default中的其他项添加到默认项中。这是我的最佳尝试:HalfWantedResult=Good.Union(Default,newMyEqualityComparer());WantedResult=HalfWantedResult.Intersect(好,newMyEqualityComparer());我教它应该工作,但我得到的结果基本上只是很好的{MyString1,MyString2}对设置,但都是默认值,所以我有所有默认值。我也尝试切换最后一个相交的默认和良好,但得到了相同的结果。首先,这是错误的:publicboolEquals(MyClassitem1,MyClassitem2){returnGetHashCode(item1)==GetHashCode(item2);}如果hashcode不同,肯定对应的2项不同,但是不保证对应的2项相等就相等。所以这是正确的Equals事实证明:publicboolEquals(MyClassitem1,MyClassitem2){if(object.ReferenceEquals(item1,item2))returntrue;如果(item1==null||item2==null)返回false;返回item1.MyString1.Equals(item2.MyString1)&&item1.MyString2.Equals(item2.MyString2);}Slacks建议(期待我)代码如下:varDefault=newList{newMyClass{MyString1="A",MyString2="A",MyString3="-"},newMyClass{MyString1="B",MyString2="B",MyString3="-"},新MyClass{MyString1="X",MyString2="X",MyString3="-"},新MyClass{MyString1="Y",MyString2="Y",MyString3="-"},新的MyClass{MyString1="Z",MyString2="Z",MyString3="-"},};varGood=newList{newMyClass{MyString1="A",MyString2="A",MyString3="+"},newMyClass{MyString1="B",MyString2="B",MyString3="+"},新的MyClass{MyString1="C",MyString2="C",MyString3="+"},新的MyClass{MyString1="D",MyString2="D",MyString3="+"},新的MyClass{MyString1="E",MyString2="E",MyString3="+"},};varwantedResult=Good.Intersect(默认,新MyEqualityComparer()).Union(默认,newMyEqualityComparer());//wantedResult://AA+//BB+//XX-//YY-//ZZ-你需要检查实际的相等性,而不仅仅是哈希码是否相等GetHashCode()不是(也不可能)GetHashCode()是无冲突的,这就是为什么首先需要Equals方法的原因。此外,您可以更简单地通过编写WantedResult=Good.Concat(Default).Distinct();来完成此操作。Distinct方法将返回每对重复项的第一项,因此这将返回所需的结果。编辑:以上就是《C#学习教程:IntersectingwithaCustomIEqualityComparerUsingLinq》的分享内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注—WantedResult=Good.Intersect(Default,newMyEqualityComparer()).Union(Default,newMyEqualityComparer());本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
