首頁 > 後端開發 > C++ > 如何使用邏輯運算符組合兩個表達式對象?

如何使用邏輯運算符組合兩個表達式對象?

Barbara Streisand
發布: 2025-01-31 05:41:09
原創
353 人瀏覽過

>本文探討了使用C#中邏輯運算符組合兩個對象的方法。 直接使用Expression<Func<bool>>AND>是不可能的。相反,使用ORExpression.AndAlsoOrElse。 當表達式使用不同的參數時,複雜性會增加。 提出了三種解決方案:Not

How to Combine Two Expression Objects Using Logical Operators?

>結合兩個布爾表達式

挑戰在於使用邏輯和或不使用兩個對象組合兩個對象。 一種簡單的方法,例如

>是無效的。 Expression<Func<bool>> expr1 AND expr2

solutions

幾種方法解決以下方法:

方法1:使用

Invoke>

此方法利用

方法在公共參數上下文中執行每個表達式。 Invoke>

static Expression<Func<bool>> AndAlso<T>(
    this Expression<Func<bool>> left,
    Expression<Func<bool>> right)
{
    var param = Expression.Parameter(typeof(T), "x");
    var body = Expression.AndAlso(
            Expression.Invoke(left, param),
            Expression.Invoke(right, param)
        );
    var lambda = Expression.Lambda<Func<bool>>(body, param);
    return lambda;
}
登入後複製

方法2:參數替換(條件)>

此方法檢查表達式是否共享相同的參數。如果是這樣,則使用更簡單的

。否則,它使用第一個參數來調用第二個表達式。 AndAlso>

static Expression<Func<bool>> AndAlso<T>(
    this Expression<Func<bool>> expr1,
    Expression<Func<bool>> expr2)
{
    ParameterExpression param = expr1.Parameters[0];
    if (ReferenceEquals(param, expr2.Parameters[0]))
    {
        return Expression.Lambda<Func<bool>>(
            Expression.AndAlso(expr1.Body, expr2.Body), param);
    }
    return Expression.Lambda<Func<bool>>(
        Expression.AndAlso(
            expr1.Body,
            Expression.Invoke(expr2, param)), param);
}
登入後複製

方法3:ExpressionVisitor>

這種複雜的方法採用

在一個表達式中系統地替換參數以匹配另一個參數,然後再應用ExpressionVisitor>。 AndAlso

public static Expression<Func<bool>> AndAlso<T>(
    this Expression<Func<bool>> expr1,
    Expression<Func<bool>> expr2)
{
    var parameter = Expression.Parameter(typeof(T));

    var leftVisitor = new ReplaceExpressionVisitor(expr1.Parameters[0], parameter);
    var left = leftVisitor.Visit(expr1.Body);

    var rightVisitor = new ReplaceExpressionVisitor(expr2.Parameters[0], parameter);
    var right = rightVisitor.Visit(expr2.Body);

    return Expression.Lambda<Func<bool>>(
        Expression.AndAlso(left, right), parameter);
}

private class ReplaceExpressionVisitor : ExpressionVisitor
{
    private readonly Expression _oldValue;
    private readonly Expression _newValue;

    public ReplaceExpressionVisitor(Expression oldValue, Expression newValue)
    {
        _oldValue = oldValue;
        _newValue = newValue;
    }

    public override Expression Visit(Expression node)
    {
        if (node == _oldValue)
            return _newValue;
        return base.Visit(node);
    }
}
登入後複製
方法的選擇取決於表達式的複雜性和優化性能的需求。 方法1很簡單,當參數匹配時,方法2提供了性能改進,方法3為處理不同參數提供了強大的解決方案。

以上是如何使用邏輯運算符組合兩個表達式對象?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板