Func<T, bool> expr = x => x.Prop != 1;

somelist = somelist.Where(expr);

到目前一切尚好.但我想这样否定expr:

somelist = somelist.Where(!expr);

这会导致编译错误:Cannot apply ! operator to operand of type Func<T, bool>.

我必须为此创建另一个表达式变量吗?

Func<T, bool> expr2 = x => x.Prop == 1;

推荐答案

Func<T, bool> expr = x => x.Prop != 1;

Func<T, bool> negativeExpr = value => !expr(value);

somelist = somelist.Where(value => !expr(value));

使用表达式树时,以下操作可以实现:

Expression<Func<T, bool>> expr = x => x.Prop != 1;

var negativeExpr = Expression.Lambda<Func<T, bool>>(
    Expression.Not(expr.Body), 
    expr.Parameters);

somelist = somelist.Where(negativeExpr);

为了让生活更轻松,您可以创建以下扩展方法:

public static Func<T, bool> Not<T>(
    this Func<T, bool> predicate)
{
    return value => !predicate(value);
}

public static Expression<Func<T, bool>> Not<T>(
    this Expression<Func<T, bool>> expr)
{
    return Expression.Lambda<Func<T, bool>>(
        Expression.Not(expr.Body), 
        expr.Parameters);
}

现在你可以这样做:

somelist = somelist.Where(expr.Not());

Asp.net相关问答推荐

在 Web.Config 的 Location Path 元素中指定多个目录

log4net 记录所有未处理的应用程序错误

在 lambda 表达式中否定 Func

ASP.Net - App_Data & App_Code 文件夹?

解析器错误消息:无法加载类型sometype

解析 JSON 响应的最简单方法

文本框的输入按键触发事件

倒带请求正文流

Asp.net 中的下拉列表验证使用必填字段验证器

如何获取 ActionLink 的工具提示?

在 ASP.NET MVC 中使用 Razor 创建可重用的 HTML 视图组件

如何针对异常需求自定义 ASP.NET Web API AuthorizeAttribute

为 ASP.NET Core MVC 显示 404 Not Found 页面

HttpContext.Current.Request.Url.Host 它返回什么?

将对象传递给 HTML 属性

通过 CultureInfo 格式化字符串

RegisterStartupScript 不适用于 ScriptManager、Updatepanel.这是为什么?

ASP.NET 邮箱验证器正则表达式

ConfigurationManager.AppSettings 缓存

SignalR 2.0 错误:无法加载文件或程序集 Microsoft.Owin.Security