【问题标题】:IsNumeric check in linqIsNumeric 签入 linq
【发布时间】:2018-11-14 15:56:33
【问题描述】:

下面的linq

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

抛出异常,因为某些 row["EXM_MARKS"] 具有非数值,例如 AB 等。 我怎样才能从中得到只有数字的总和?

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    添加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();
    

    【讨论】:

    • 我知道,我想问有没有直接的函数来处理它?
    • 您可以选择虚拟值而无需额外的 Convert.ToDecimal 调用
    • @YuriyRozhovetskiy:不,你不能。这将为所有行选择最后一行的值。
    • 如果是这样,你该如何解释:string value = "1 a 2 b 3 c"; int 虚拟 = 0; var digits = (from digit in value.Split(' ') where int.TryParse(digit, out dummy) select dummy).ToList(); digits.ForEach(Console.WriteLine);
    • @YuriyRozhovetskiy:是的,你是对的。延期执行让我受益匪浅。
    【解决方案2】:

    您可以创建一个扩展方法 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;
    }
    

    这种方法的优点是它看起来很干净,并且您不会像所有其他答案那样将每个对象转换两次。

    【讨论】:

      【解决方案3】:

      使用

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

      【讨论】:

        【解决方案4】:

        您可以制作一些像这样的扩展实用程序类以获得优雅的解决方案:

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

        希望这会有所帮助。

        【讨论】:

          【解决方案5】:

          对于 linq to sql 查询,您可以使用内置的SqlFunctions.IsNumeric

          来源:SqlFunctions.IsNumeric

          【讨论】:

            【解决方案6】:
            var subjectMarks = objDatatable.Rows.Where(row => row["EXM_MARKS"].ToString().All(char.isDigit))
            

            部分解决方案进入:here

            【讨论】:

            • 结果将是一个包含所有数字项的数组
            猜你喜欢
            • 2011-01-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-24
            • 2011-12-22
            • 1970-01-01
            • 2015-03-25
            • 1970-01-01
            相关资源
            最近更新 更多