簡體   English   中英

C#否定了一個表達式

[英]C# negate an expression

我正在尋找一種方法來否定用於過濾IQueryable序列的表達式。

所以,我有類似的東西:

Expression<Func<T, bool>> expression = (x => true);

現在我想創建一個導致屈服(x => false)expression - 所以我基本上想要否定expression

我發現自己的工作方法是這樣的:

var negatedExpression = 
   Expression.Lambda<Func<T, bool>> (Expression.Not(expression.Body),
                                     expression.Parameters[0])));

但我幾乎肯定有更好的方法 - 你能幫助我嗎? (可能是像Not(expression)類的東西)。

一種簡單的擴展方法:

public static Expression<Func<T, bool>> Not<T>(this Expression<Func<T, bool>> one)
{
    var candidateExpr = one.Parameters[0];
    var body = Expression.Not(one.Body);

    return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
}

用法:

Expression<Func<int, bool>> condition = x => x > 5;
var source = Enumerable.Range(1, 10);
var result1 = source.Where(condition.Compile());   //6,7,8,9,10
var result2 = source.Where(condition.Not().Compile());    //1,2,3,4,5

張貼供將來參考。

Danny Chen的答案可以更通用:

public static Expression<TFunc> Not<TFunc>(this Expression<TFunc> baseExpr)
{
    var param = baseExpr.Parameters;
    var body = Expression.Not(baseExpr.Body);
    var newExpr = Expression.Lambda<TFunc>(body, param);
    return newExpr;
}

此版本可以接收包含任意數量輸入參數的Expression。 然而,它只增加了一點可用性,因為Expression很可能會被傳遞給像IEnumerable.Where這樣的函數。

那這個呢?

Expression<Func<bool>> expr = () => true;
Expression<Func<bool>> negated = () => !expr.Compile()();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM