使用 LINQ 在 (string) 列中查找最大 (int) 值

Find largest (int) value in the (string) column with LINQ

我有一个看起来像这样的专栏:

sNumber          Value (String)   
A                10
b                50
c                90
d                Hi
e                !!!
f                #123

我要搜索最大值,即90,然后自增1。

在搜索时,我想忽略 'Hi' 和任何包含的字符。

我成功地将 number 递增 1 到数据类型 int 列。 这是下面的代码。

var sQuery =
    (from staff in db.Staffs where staff.sNumber >= 0
    orderby staff.sNumber ascending select staff.sNumber )
    .Distinct().ToList();

int counter = sQuery .Count;
snumber = sQuery [counter - 1];
dmlist.sNumber = snumber + 1;

我还能够为 MS SQL 查询编写代码以找出我的目标结果。 但无法将其转换为 LINQ。

SELECT Convert(BIGINT, sNumber) As sNumber
  FROM DATABASE_NAME
  WHERE ISNUMERIC(sNumber) > 0
  ORDER BY sNumber desc

有没有人可以指导我将此 MS SQL 查询转换为 LINQ 或更好的想法以仅获取数字结果?

        List<String> column = new List<string>()
        {
            "12", "abc", "99", "!", "654"
        };

        var data = column.Where(x =>
        {
            decimal temp;
            return decimal.TryParse(x, out temp);
        }).Max(x => Convert.ToDecimal(x));
        data++;

遗憾的是,如果您想在 LINQ 查询中执行此操作,则需要解析两次。您将首先获得一个有效的值列表。然后,您需要根据转换为值类型的每个有效项目获得最大值。然后你可以修改你认为合适的值。

更新 -

这是另一种选择。您可以在进行过程中遍历转换它的每个项目。任何无法转换的项目只需将它们设置为 NULL 然后消除它们,然后找到最大值并增加它。

        Func<string, decimal?> stringToNullableDecimal = s =>
        {
            decimal temp;
            if (decimal.TryParse(s, out temp))
            {
                return temp;
            }
            return null;
        };
        List<string> column = new List<string>()
        {
            "12", "abc", "99", "!", "654"
        };
        var data = column.Select(x => stringToNullableDecimal(x)).Where(x => x.HasValue).Max();
        data++;

您也可以通过创建一个 Object 的列表来做到这一点,如下所示,您只需要使用 .ToString() 不能使用第一个参数,您就可以将对象保留在它们的原始形式而不必通过将 "" 环绕在它们周围将 Int32 值更改为字符串结果产生 91

var maxList = new List<object>
{
    10,
    50,
    90,
    "Hi",
    "!!!",
    "#123"
};

var incData = maxList.Where(m =>
{
    decimal temp;
    return decimal.TryParse(m.ToString(), out temp);
}).Max(m => Convert.ToDecimal(m));
incData++;