gpt4 book ai didi

linq - 如何使用表达式进行 Linq 并集和相交?

转载 作者:行者123 更新时间:2023-12-03 22:13:50 25 4
gpt4 key购买 nike

我有代码

public static class PredicateExtensions
{

public static Expression<Func<T, bool>> True<T>() { return f => true; }
public static Expression<Func<T, bool>> False<T>() { return f => false; }

public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
{
var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>(Expression.Or(expression1.Body, invokedExpression), expression1.Parameters);
}
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
{
var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>(Expression.And(expression1.Body, invokedExpression), expression1.Parameters);
}
}

如何使用此代码代替 LINQ Union 和 Intersect 方法?

最佳答案

如果您有以下形式的并集和交集:

var union = source.Where(predicate0).Union(source.Where(predicate1));
var inter = source.Where(predicate0).Intersect(source.Where(predicate1));

然后 union将具有以下任一值 predicate0predicate1是真的,而 inter将具有 predicate0 的值和 predicate1是真的。

出于这个原因,以下将产生相同的结果:
var union = source.Where(predicate0.Or(predicate1));
var inter = source.Where(predicate0.And(predicate1));

这取决于由两个 Where 产生的并集和交集的组件。查询虽然。在喜欢:
var union = source1.Where(predicate0).Select(item => item.ID)
.Union(source2.Where(predicate1).Select(item => item.ID));

那么很可能谓词甚至不是同一类型,还有其他情况下组合谓词不能替代 UnionIntersect .

就人们对谓词、联合和交集的工作方式的理解而言,能够以两种方式考虑第一个例子是有用的。

关于linq - 如何使用表达式进行 Linq 并集和相交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9606774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com