使用LINQ在(字符串)列中查找最大(int)值

时间:2015-02-09 21:55:25

标签: c# sql-server linq

我的列看起来像这样:

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

我想搜索最大值90,然后递增1。

在搜索中,我想忽略'嗨'和任何包含字符。

我成功地将数字增加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 Query代码来查找我的目标结果。 但是无法将其转换为LINQ。

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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

你也可以通过创建一个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++;