C# DataTable 如何实现横向合计(行合计)

JJYY0088 2017-02-22 03:44:45
姓名 A B C D … 合计
张三 2 3 0 4 9
李四 1 2 3 0 6


如上图,查出来一个数据源,但是没有“合计”列的,现在动态加进去要统计总和,由于要合计的列很多(30多),有没有更好的方法去 计算总和,每行每列去遍历很是麻烦!!!!!
...全文
878 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
当然,如果你要避开字符串和日期列(你还可以自己设计更多,例如是“控件”类型列),可以添加条件
/// <summary>
/// 为 DataTable 增加合计列
/// </summary>
/// <param name="tb">源DataTable</param>
/// <param name="columnName">合计列的标题名</param>
/// <returns>锁增加的列的数据定义</returns>
public static DataColumn test(DataTable tb, string columnName)
{
    var cs = tb.Columns;        //获得 tb 的数据定义
    var res = cs.Add(columnName, typeof(double));       //增加合计列
    foreach (DataRow dr in tb.Rows)
        dr[columnName] = cs.Cast<DataColumn>().Aggregate(0.0, (sum, col) =>     //遍历所有列进行累加,并将结果赋值到本行合计列
        {
            var value = dr[col];
            if (value is string || value is DateTime || typeof(Control).IsAssignableFrom(value.GetType()))
                return sum;
            else
                return sum + (double)dr[col];
        });
    return res;
}
引用 楼主 LXH060204 的回复:
由于要合计的列很多(30多),有没有更好的方法去 计算总和,每行每列去遍历很是麻烦!!!!!
实际上,是否“麻烦”,不在于人家数据是否多,而在于你自己!
  • 打赏
  • 举报
回复
上面的代码其实并不复杂。
cs.Cast<DataColumn>()
这样写,是因为古老的 DataColumnCollection 类型对象不支持枚举,所以无法直接使用 Linq。那么使用 Cast<T> 就可以把它明确封装为可枚举的对象了,可以使用 Linq 了。
Aggregate
是 Linq 中的累积器技术,也就是 map-reduce 的 recuce!
  • 打赏
  • 举报
回复
如果要写代码,可以这样写(我没有测试,如果有语法错误,自己改一下)
/// <summary>
/// 为 DataTable 增加合计列
/// </summary>
/// <param name="tb">源DataTable</param>
/// <param name="columnName">合计列的标题名</param>
/// <returns>锁增加的列的数据定义</returns>
public static DataColumn test(DataTable tb, string columnName)
{
    var cs = tb.Columns;        //获得 tb 的数据定义
    var res = cs.Add(columnName, typeof(double));       //增加合计列
    foreach (DataRow dr in tb.Rows)
        dr[columnName] = cs.Cast<DataColumn>().Aggregate(0.0, (sum, col) =>     //遍历所有列进行累加,并将结果赋值到本行合计列
        {
            return sum + (double)dr[col];
        });
    return res;
}
实际上 DataTable 支持在每一列上设置一个 Expression 表达式,从而它自动给你计算。这样,你只要遍历 cs 的每一个 DataCoumn,取到每一列的名字,然后动态拼接一个字符串类类型的 Expression 表达式,设置给合计列。 你实际上并不需要枚举 DataTable 的每一行。每当你访问 DataTable 的某一行数据的合计列时,它会自动给你合计。
maldiniwn 2017-02-22
  • 打赏
  • 举报
回复
如果是从数据库查: 1、数据库后面直接加一列,保存“合计” 2、在sql语句查询的时候,直接累加前面几列的值,查出来(如select a,b,c,d,a+b+c+d as e from table)。但是如果数据量大,计算会花点时间 从代码着手: 1、用DataReader逐行读取,自己创建DataRow,然后每一行计算“合计” 2、用Adapter.Fill( ) 填充,然后循环每行,计算“合计”
  • 打赏
  • 举报
回复
Anymore 2017-02-22
  • 打赏
  • 举报
回复
好像公式类似的吧 http://bbs.csdn.net/topics/80500222
EnForGrass 2017-02-22
  • 打赏
  • 举报
回复
http://www.cnblogs.com/gengaixue/p/3358480.html
by_封爱 版主 2017-02-22
  • 打赏
  • 举报
回复
只能遍历

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧