visual studio see remarks method example cref comment c# expression negate

studio - see cref c#



C#niega una expresión (3)

Publicación para referencia futura.

La respuesta de Danny Chen se puede hacer más genérica:

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; }

Esta versión puede recibir una expresión con cualquier número de parámetros de entrada. Sin embargo, solo agrega un poco de facilidad de uso, ya que la Expresión probablemente se pasaría a una función como IEnumerable.Where . De todos modos.

Estoy buscando una manera de negar una expresión usada para filtrar secuencias IQueryable .

Entonces, tengo algo como:

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

Ahora deseo crear la expresión que daría como resultado (x => false) , así que básicamente quiero negar la expression .

El método de trabajo que me he encontrado funciona así:

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

Pero estoy casi seguro de que hay una mejor manera. ¿Podrías ayudarme? (algo como Not(expression) , probablemente).


Que hay de esto

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


Un método de extensión fácil:

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); }

Uso:

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