C# IsNumeric签入linq
下面的linqC# IsNumeric签入linq,c#,linq,C#,Linq,下面的linq var subjectMarks = (from DataRow row in objDatatable.Rows select Convert.ToDecimal(row["EXM_MARKS"])).Sum(); 引发异常,因为某些行[“EXM_标记”]具有非数值,如AB等。 如何从它们中只得到数字的和?添加where子句,该子句过滤掉无法解析为小数的记录。尝试: decimal dummy; var subjectMarks =
var subjectMarks = (from DataRow row in objDatatable.Rows
select Convert.ToDecimal(row["EXM_MARKS"])).Sum();
引发异常,因为某些行[“EXM_标记”]
具有非数值,如AB
等。
如何从它们中只得到数字的和?添加
where
子句,该子句过滤掉无法解析为小数的记录。尝试:
decimal dummy;
var subjectMarks = (from DataRow row in objDatatable.Rows
where decimal.TryParse(row["EXM_MARKS"], out dummy)
select Convert.ToDecimal(row["EXM_MARKS"])).Sum();
使用
您可以创建一个扩展方法
SafeConvertToDecimal
,并在LINQ查询中使用它:
var subjectMarks = (from DataRow row in objDatatable.Rows
select row["EXM_MARKS"].SafeConvertToDecimal()).Sum();
此扩展方法如下所示:
public static decimal SafeConvertToDecimal(this object obj)
{
decimal result;
if(!decimal.TryParse(obj.ToString(), out result))
result = 0;
return result;
}
这种方法的优点是,它看起来很干净,而且每个对象的转换不会比所有其他对象的转换次数多出一倍。
您可以为优雅的解决方案制作一些扩展实用程序类,如下所示:
public static class TypeExtensions
{
public static bool IsValidDecimal(this string s)
{
decimal result;
return Decimal.TryParse(s, out result);
}
}
并以这种方式使用它:
var subjectMarks = (from DataRow row in objDatatable.Rows
where row["EXM_MARKS"].IsValidDecimal()
select Convert.ToDecimal(row["EXM_MARKS"])).Sum();
希望这有帮助
var subjectMarks = objDatatable.Rows.Where(row => row["EXM_MARKS"].ToString().All(char.isDigit))
解决方案的一部分包括:对于linq到sql查询,您可以使用内置的
SqlFunctions.IsNumeric
来源:我知道,我在问有没有直接的函数来处理这个问题?你可以选择虚拟值而不需要额外的Convert.ToDecimalcall@YuriyRozhovetskiy:不,你不能。这将为所有行选择最后一行的值。如果是,您如何解释:string value=“1 a 2 b 3 c”;int-dummy=0;var digits=(从value.Split(“”)中的数字,其中int.TryParse(digit,out dummy)选择dummy.ToList();数字。ForEach(控制台。写入线)@尤里约日霍维茨基:是的,你是对的。延迟执行got me.result将是一个包含所有数值项的数组
var subjectMarks = objDatatable.Rows.Where(row => row["EXM_MARKS"].ToString().All(char.isDigit))