我可以将Linq的Except()与lambda表达式比较器一起使用吗?我知道我可以调用linq的Except并指定自定义IEqualityComparer,但是为每种数据类型实现一个新的Comparer类似乎是一种矫枉过正的方法。我可以使用lambda表达式来提供与Where或其他LINQ函数相同的函数吗?如果我不能,还有其他选择吗?我不认为你可以直接使用基本的LINQ接口,但我看到人们实现了一个带有扩展方法的LambdaComparer类,可以帮助你做到这一点。这是任何仍在寻找的人的例子;这是实现自定义lambda比较器的另一种方法。publicclassLambdaComparer:IEqualityComparer{privatereadonlyFunc_expression;publicLambdaComparer(Funclambda){_expression=lambda;}publicboolEquals(Tx,Ty){return_expression(x,y);}publicintGetHashCode(Tobj){/*如果您只是为散列返回0,则Equals比较器将启动。底层评估会检查散列,然后在评估为假时将评估短路。否则,它检查Equals。如果您强制哈希为真(通过假设两个对象都为0),您将始终无法进行等于检查,这正是我们一直追求的目标。*/返回0;}}然后你可以为linq创建一个扩展,除掉一个接受lambda的交互//////返回第一个集合中的所有项目,除了第二个集合中匹配lambda条件的项目//////类型///第一个列表///第二个列表///过滤表达式///过滤后的列表publicstaticIEnumerableExcept(thisIEnumerablelistA,IEnumerablelistB,Funclambda){返回列表A。除了(listB,新的LambdaComparer(lambda));}//////返回第一个集合中与第二个集合中匹配lambda条件的项相交的所有项//////类型///第一个列表///第二个列表///过滤器表达式///过滤列表publicstaticIEnumerableIntersect(thisIEnumerablelistA,IEnumerablelistB,Funclambda){returnlistA.Intersect(listB,newLambdaComparer(lambda));用法:varavailableItems=allItems.Except(filterItems,(p,p1)=>p.Id==p1.Id);你能用lambda过滤掉你需要的值吗请请求示例:staticvoidMain(string[]args){varfirstCustomers=new[]{newCustomer{Id=1,Name="Bob"},newCustomer{Id=2,Name="Steve"}};varsecondCustomers=new[]{newCustomer{Id=2,Name="Steve"},newCustomer{Id=3,Name="John"}};varcustomers=secondCustomers.Where(c=>!firstCustomers.Select(fc=>fc.Id).Contains(c.Id));}publicclassCustomer{publicintId{get;放;}公共字符串名称{得到;放;}}这是我开始的简单情况:publicclassCustomComparer:IEqualityComparerwhereTSource:class{publicCustomComparer(FuncgetComparisonObject){如果(getComparisonObject==null)thrownewArgumentNullException("getComparisonObject");this.getComparisonObject=getComparisonObject;}//////判断指定对象是否相等。/////////如果指定的对象相等则为真;否则,假的。//////要比较的类型的第一个对象。///这要比较的类型的第二个对象。///publicboolEquals(TSourcex,TSourcey){if(x==null){return(y==null);}elseif(y==null){返回false;}返回EqualityComparer.Default.Equals(getComparisonObject(x),getComparisonObject(y));}//////返回指定对象的哈希码。/////////指定对象的哈希码。//////要为其返回哈希码的。///的类型是引用类型,为null。///publicintGetHashCode(TSourceobj){returnEqualityComparer.Default.GetHashCode(getComparisonObject(obj));}}使用方法:varmyItems=allItems.Except(theirItems,newCustomComparer(item=>item.Name));使用扩展名!publicstaticIEnumerableExcept(thisIEnumerableitems,IEnumerableother,FuncgetKey){returnfromiteminitemsjoinotherIteminotherongetKey(item)equalsgetKey(otherItem)intotempItemsfromtempintempItems.DefaultIfEmpty()whereReferenceEquals(null,temp)||温度.Equals(默认(T))选择项目;}resource这是'除了r解决方案,基于LINQ外连接技术:fromlinnew[]{1,2,3}joinrinnew[]{2,4,5}onlequalsr进入rrwhere!rr.Any()selectlwillyield:1,3但你可以试试这个很简单,我认为代码包含错误。当然代码极少,没有LINQ转db等。以上是C#学习教程:CanIuseLinq'sExcept()andlambdaexpressioncomparators?所有分享的内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——publicstaticIEnumerableExceptPredicate(thisIEnumerablefirst,IEnumerablesecond,Funccompare){varitmFirstinfirst){if(!second.Any(itmsecond=>compare(itmFirst,itmsecond))){yieldreturnitmFirst;}}产量中断;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
