Isnumeric检查linq

时间:2011-09-28 10:06:07

标签: c# linq

以下linq

var subjectMarks = (from DataRow row in objDatatable.Rows
                    select Convert.ToDecimal(row["EXM_MARKS"])).Sum();

引发异常,因为某些row["EXM_MARKS"]具有非AB等非数字值。 我怎样才能得到它们中只有数字的总和?

6 个答案:

答案 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

来源:SqlFunctions.IsNumeric

答案 5 :(得分:0)

var subjectMarks = objDatatable.Rows.Where(row => row["EXM_MARKS"].ToString().All(char.isDigit))

解决方案的一部分是:here