gpt4 book ai didi

wpf - 无法使用表达式比较 NAN

转载 作者:行者123 更新时间:2023-12-02 00:00:47 26 4
gpt4 key购买 nike

我正在使用 Expression 来比较值,并且我正在使用以下代码,

下面是创建 lambda 表达式的方法。

    public static class Test
{
public static Expression<Func<T, bool>> TransformToPredicate<T>(Expression<Func<T, double>> getvalue, double value)
{
System.Linq.Expressions.Expression equals = System.Linq.Expressions.Expression.Equal(getvalue.Body,
System.Linq.Expressions.Expression.Constant(value));
return System.Linq.Expressions.Expression.Lambda<Func<T, bool>>(equals, getvalue.Parameters);
}
}

在下面的代码中,将 Nan 与 Nan 值进行比较时返回 false。使用表达式时如何克服这个问题?我需要以更通用的方式执行此操作吗?

           Employee emp = new Employee();
emp.SickLeaveHours = double.NaN;
Expression<Func<Employee, double>> getfunc = x => x.SickLeaveHours;
var predicate = Test.TransformToPredicate<Employee>(getfunc, double.NaN);
var func = predicate.Compile();
var flag = func(emp);

当我使用非 Nan 值时,下面的代码工作正常。

            Employee emp = new Employee();
emp.SickLeaveHours = 10.0;
Expression<Func<Employee, double>> getfunc = x => x.SickLeaveHours;
var predicate = Test.TransformToPredicate<Employee>(getfunc, 10.0);
var func = predicate.Compile();
var flag = func(emp);

我知道 double.Nan == double.Nan 会返回 false,我们必须使用 double.IsNAN 或 value != value。但是我不确定在使用表达式时如何做到这一点。

最佳答案

您正在通过对象引用进行比较。这就是为什么你总是得到错误的返回。但是每种类型都提供了 Equals() 方法。为了比较两个 double 或任何两个相同的类型,您应该调用它们的 Equals 函数。调用 equals 函数与 Expression.Equal 不同。

这是一个演示:

var wrong =
System.Linq.Expressions.Expression.Lambda<Func<bool>>(
System.Linq.Expressions.Expression.Equal(System.Linq.Expressions.Expression.Constant(double.NaN),
System.Linq.Expressions.Expression.Constant(double.NaN))).Compile();

// is always false
bool result = wrong();

ConstantExpression first = System.Linq.Expressions.Expression.Constant(double.NaN, typeof(double));
ConstantExpression second = System.Linq.Expressions.Expression.Constant(double.NaN, typeof(double));

var right =
System.Linq.Expressions.Expression.Lambda<Func<bool>>(
System.Linq.Expressions.Expression.Call(first, first.Type.GetMethod("Equals", new[] { second.Type }), second)).Compile();

// will always be true
result = right();

关于wpf - 无法使用表达式比较 NAN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21545541/

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