Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IsNumeric签入linq_C#_Linq - Fatal编程技术网

C# IsNumeric签入linq

C# 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 =

下面的linq

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))