我的列看起来像这样:
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或更好的想法只获得数字结果?
答案 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++;