C#LinqIntersect/ExceptPartofObject我环顾四周,在这里找不到任何帮助。我有一个类:classThisClass{privatestringa{get;设置;}私有字符串b{get;set;}}我想使用Linq的Intersect和Except方法,即:privateListfoo=newList();私有列表栏=新列表();然后我分别填写两个列表。我想做的,例如(我知道这不对,只是伪代码),如下:foo[a].Intersect(bar[a]);我怎样才能做到这一点?感谢您的帮助:)也许//返回相交属性'a'值的列表foo.Select(f=>fa).Intersect(bar.Select(b=>ba));顺便说一句,财产应该是公开的。如果您想要一个要相交的单个属性的列表,那么所有其他漂亮的LINQ解决方案都可以正常工作。但!如果你想在整个类上相交,那么结果是一个列表而不是一个列表,你必须编写自己的相等比较器。foo.Intersect(bar,newYourEqualityComparer());与除相同。publicclassYourEqualityComparer:IEqualityComparer{#regionIEqualityComparerMemberspublicboolEquals(ThisClassx,ThisClassy){//这里没有空检查,你可能想要这样做,或者更正它以只比较对象的一部分returnxa==ya&&xb==yb;}publicintGetHashCode(ThisClassobj){unchecked{varhash=17;//这里也一样,如果只想获取a的hashcode,去掉bhash=hash*23+obj.a.GetHashCode();hash=hash*23+obj.b.GetHashCode();返回散列;}}#endregion}不确定与相交和比较相比的速度,但是如何://Intersectvarinter=foo.Where(f=>bar.Any(b=>ba==fa));//Except-foo的值不在bar中varexcept=foo.Where(f=>!bar.Any(b=>ba==fa));foo.Select(x=>xa).Intersect(bar.Select(x=>xa))究竟做了什么?当你通过a的唯一值来标识ThisClass的两个实例时,你是想得到一个字符串列表,还是一个由类中所有a组成的ThisClass列表?如果是前者,@lazyberezovksy和@Tilak的两个答案应该有效。如果是后者,则必须覆盖IEqualityComparer或IEquatable,以便Intersect知道是什么使ThisClass的两个实例等效:publicboolEquals(ThisClassother){returnstring.Equals(this.a,other.a);然后你可以调用:varintersection=foo.Intersect(bar);我知道这已经过时了,但你不能只覆盖类本身的Equals和GetHashCode吗?classThisClass{公共字符串a{get;设置;}私有字符串b{get;set;}publicoverrideboolEquals(objectobj){//如果你只想比较一个ThisClass那=(ThisClass)obj;returnstring.Equals(a,that.a/*可选:不区分大小写?*/);}publicoverrideintGetHashCode(){returna.GetHashCode();您应该创建IEqualityComparer。您可以将IEqualityComparer传递给Intersect()方法。这将帮助您更轻松地获得列表(与条形相交)。以上就是C#学习教程的全部内容:C#Linq求交/排除对象的一部分。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——varintersectionList=foo.Intersect(bar,newThisClassEqualityComparer()).ToList();类ThisClassEqualityComparer:IEqualityComparer{publicboolEquals(ThisClassb1,ThisClassb2){returnb1.a==b2.a;}publicintGetHashCode(Boxbx){//要忽略比较哈希码,请考虑这一点。//我想强制调用Equals()return0;}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
