c# 基于DataTable的Compute方法的扩展

 

DataTable.Compute(String, String) 方法

计算用来传递筛选条件的当前行上的给定表达式。

   

定义

https://docs.microsoft.com/zh-cn/dotnet/api/system.data.datatable.compute?view=netframework-4.8

 

Compute函数的参数就两个:Expression,和Filter。

Expresstion是计算表达式,关于Expression的详细内容请看这里https://docs.microsoft.com/zh-cn/dotnet/api/system.data.datacolumn.expression?view=netframework-4.8

或者参考转载的  C#中DataTable中的Compute方法使用收集

 

Filter则是条件过滤器,类似sql的Where条件。 

基于以上信息,扩展DataTable类。

可以直接使用

DataTable dt=new Datable();

dt.GetMinValue(“列名”);获取列最小值。

 

    /// <summary>
    /// 使用c# 特性“扩展类方法”
    /// 使用教程:
    /// a、需要给那个类型做扩展,在类型前添加this ,并把该参数放置在第一位。
    /// b、使用扩展的方法时,必须引用当前命名空间,否则扩展方法无效。
    /// </summary>
    public static class DataTableHelper
    {


        /// <summary>
        /// 获取DataTable中,某列的和
        /// </summary>
        /// <param name="table">The table.</param>
        /// <param name="columnName">Name of the column.</param>
        /// <returns></returns>
        public static object GetSumValue(this DataTable table, string columnName)
        {
            return GetValueByFunction(table, columnName, "SUM({0})");
        }
        /// <summary>
        /// 获取DataTable中,某列的最大值
        /// </summary>
        /// <param name="table">The table.</param>
        /// <param name="columnName">Name of the column.</param>
        /// <returns></returns>
        public static double GetMaxValue(this DataTable table, string columnName)
        {
            return GetValueByFunction(table, columnName, "MAX({0})");
        }
        /// <summary>
        /// 获取DataTable中,某列的最小值
        /// </summary>
        /// <param name="table">The table.</param>
        /// <param name="columnName">Name of the column.</param>
        /// <returns></returns>
        public static double GetMinValue(this DataTable table, string columnName)
        {
            return GetValueByFunction(table, columnName, "Min({0})");
        }

        /// <summary>
        ///  统计标准偏差
        /// </summary>
        /// <param name="table"></param>
        /// <param name="columnName"></param>
        /// <returns></returns>
        public static double GetStDevValue(this DataTable table, string columnName)
        {
            return GetValueByFunction(table, columnName, "StDev({0})");
        }
        /// <summary>
        ///  统计方差
        /// </summary>
        /// <param name="table"></param>
        /// <param name="columnName"></param>
        /// <returns></returns>
        public static double GetVarValue(this DataTable table, string columnName)
        {
            return GetValueByFunction(table, columnName, "Var({0})");
        }


        /// <summary>
        /// 根据指定公式,获取DataTable中,某列的公式值
        /// </summary>
        /// <param name="table">要获取数据的源DataTable</param>
        /// <param name="columnName">列名称</param>
        /// <param name="strFunction">字符串形式的公式</param>
        /// <returns></returns>
        public static double GetValueByFunction(this DataTable table,string columnName, string strFunction)
        {
            if (strFunction == string.Empty || strFunction == null)
                return double.NaN;

            string  expression = string.Format(  strFunction  , columnName);
         
            double result = double.NaN;

            switch (table.Columns[columnName].DataType.ToString().ToLower())
            {
                case "system.datetime":
                    result = Convert.ToDateTime(table.Compute(expression, "")).ToOADate();
                    break;
                case "system.float":
                case "system.double":
                case "system.short":
                case "system.int":
                case "system.long":
                    result = Convert.ToDouble(table.Compute(expression, "").ToString());
                    break;
            }
            return result;
        }

    }

  

posted @ 2019-12-03 21:20  JersonLiang  阅读(800)  评论(1)    收藏  举报