【问题标题】:What is the most efficient method to calculate total numbers in a DataTable Column [duplicate]计算数据表列中总数的最有效方法是什么[重复]
【发布时间】:2017-12-06 14:11:53
【问题描述】:

我有一个数据表,其中有一列名为x value的数字

我想返回该列的总和值。

该列将始终包含一个数字(因此无需担心空白/空值)。

我的代码:

            int x = 0;

            foreach (DataRow dr in SqlCon.ds.Tables[3].Rows)
            {
                foreach (DataColumn dc in  SqlCon.ds.Tables[3].Columns)
                {
                    if (dc.ColumnName == "x value")
                    {
                        //calc value
                    }

                }
            }

非常感谢,

ps。已经看过了,但找不到重复的(我想它大约是星期一早上,我的谷歌技能不是最好的!)

【问题讨论】:

  • 你说的 best 是什么意思?最快?
  • @user3185569 最有效的对不起。将更新问题。
  • 最简洁的:int sum = dataTable.AsEnumerable().Sum(row => (int)row["x"]);
  • var sum = dataTable.Compute("SUM(xvalue)")
  • @AlexanderPetrov 提交为答案并将其标记为正确,因为这解决了我的问题。没有受过 Linq 的教育,但似乎有效!谢谢

标签: c# datatable


【解决方案1】:
object sumOfX = SqlCon.ds.Tables[3].Compute("Sum(x value)", null);

然后转换为适当的数字类型。

DataTable.Compute

注意:这在编写代码方面可能是高效,但如果您真的需要压缩最后一个时钟周期,那么在性能方面可能有更有效的方法......但话又说回来,使用 DataTable 和 C# 可能是错误的选择。

【讨论】:

    【解决方案2】:

    您需要遍历每一行,这是肯定的。但是,您可以获取一次列索引以避免不必要的列循环:

    int sum = 0;
    DataSet ds = new DataSet();
    
    DataTable dt = ds.Tables[3];
    int columnIndex = dt.Columns["x column"].Ordinal;
    foreach (DataRow dr in dt.Rows)
    {
        sum += Convert.ToInt32(dr[columnIndex]);
    }
    

    【讨论】:

    • 使用它有什么好处:int sum = dataTable.AsEnumerable().Sum(row => (int)row["x"]); 谢谢
    • @SCramphorn foreach 比 linq 快(因为你的目标是效率):stackoverflow.com/questions/3156059/…
    • @SCramphorn 肯定比.Compute() 快​​ 试用它们并比较大数据。
    • 非常感谢。我会试试的
    • 刚刚尝试过,当我逐步完成它时,它变得更有意义了。所以最后我需要的是 Convert.ToInt32,但就性能而言,我理解。
    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 2012-08-14
    • 2013-01-23
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多