使用 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++;
我有一个看起来像这样的专栏:
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++;