使用 int.TryParse 与 Queryable 和表达式

问题描述 投票:0回答:2

我是 c# 中的表达式新手。

表达代码

var parameter = Expression.Parameter(typeof(int), "param");
var constant = Expression.Constant(5, typeof(int));
var equal = Expression.Equal(parameter, constant);
var lambdaExpression = Expression.Lambda<Func<int, bool>>(equal, parameter);
var compiledExpression = lambdaExpression.Compile();

查询包含一个字符串值,我只想在该值可转换为 int 时应用表达式

int test;
query = query.Where(i => int.TryParse(i.Key, out test) && compiledExpression(test));

这会返回一个错误,指出不支持 int.TryParse。 有什么办法解决这个问题吗?

c# .net linq lambda expression
2个回答
1
投票

你不能在那里使用 out 参数。

1) var v = q.Where(x => x.All(c => c >= '0' && c <= '9'));
2) use regex instead of All
3) write a simple method that calls Int32.Parse and just returns a bool to hide the out param

#3:

    static bool SafeIntParse(string s)
    {
        int n;
        return Int32.TryParse(s, out n);
    }

    var v = q.Where(x => SafeIntParse(x));

SafeIntParse() 方法当然是一个单独的静态方法。

编辑:

对于正则表达式方法:

        Regex regex = new Regex("^\\d+$", RegexOptions.Compiled);
        var v = q.Where(x => regex.Match(x).Success);

当然,使正则表达式对象成为类的静态对象。


0
投票

您可以实现自己的函数来获取值,int.TryParse如果字符串无法转换,默认返回0。

给你

private decimal GetDecimal(string value)
{
    if(decimal.TryParse(value, out decimal result))
        return result;
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.