以下linq
var subjectMarks = (from DataRow row in objDatatable.Rows
select Convert.ToDecimal(row["EXM_MARKS"])).Sum();
引发异常,因为某些row["EXM_MARKS"]
具有非AB
等非数字值。
我怎样才能得到它们中只有数字的总和?
答案 0 :(得分:8)
添加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();
答案 1 :(得分:5)
您可以创建扩展方法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;
}
这种方法的优势在于它看起来很干净,并且您没有像其他所有答案一样转换每个对象两次。
答案 2 :(得分:1)
使用
Decimal Z;
var subjectMarks = (from DataRow row in objDatatable.Rows
where Decimal.TryParse (row["EXM_MARKS"], out Z)
select Convert.ToDecimal(row["EXM_MARKS"])).Sum();
答案 3 :(得分:1)
您可以使用这样的扩展实用程序类来获得优雅的解决方案:
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();
希望这有帮助。
答案 4 :(得分:1)
对于linq to sql查询,您可以使用内置的SqlFunctions.IsNumeric
答案 5 :(得分:0)
var subjectMarks = objDatatable.Rows.Where(row => row["EXM_MARKS"].ToString().All(char.isDigit))
解决方案的一部分是:here