C#用DataTable实现Group by数据统计

DataTable dt = new DataTable();
 dt.Columns.AddRange(new DataColumn[] { new DataColumn("name", typeof(string)),
                                         new DataColumn("sex", typeof(string)),
                                         new DataColumn("score", typeof(int)) });
 dt.Rows.Add(new object[] { "张三","男",1 });
 dt.Rows.Add(new object[] { "张三","男",4 });
 dt.Rows.Add(new object[] { "李四","男",100 });
 dt.Rows.Add(new object[] { "李四","女",90 });
 dt.Rows.Add(new object[] { "王五","女",77 });
 DataTable dtResult = dt.Clone();
 for (int i = 0; i < dt.Rows.Count; )
 {
     DataRow dr = dtResult.NewRow();
     string name = dt.Rows[i]["name"].ToString();
     string sex = dt.Rows[i]["sex"].ToString();
     dr["name"] = name;
     dr["sex"] = sex;
     int score = 0;
     //内层也是循环同一个表,当遇到不同的name时跳出内层循环
     for (; i < dt.Rows.Count; )
     {
         if (name == dt.Rows[i]["name"].ToString()&&name == dt.Rows[i]["sex"].ToString())
         {
             score += Convert.ToInt32(dt.Rows[i]["score"]);
             dr["score"] = score;
             i++;
         }
         else
         {
             break;
         }
     }
     dtResult.Rows.Add(dr);
 
}
 
dtResult中的数据即是最终结果。 
 
2、 借助DataTable的Compute方法,DataTable中数据不用事先排好序。
 DataTable dt = new DataTable();
 dt.Columns.AddRange(new DataColumn[] { new DataColumn("name", typeof(string)),
                                          new DataColumn("sex", typeof(string)),
                                          new DataColumn("score", typeof(int)) });
 dt.Rows.Add(new object[] { "张三","男",1 });
 dt.Rows.Add(new object[] { "张三","男",4 });
 dt.Rows.Add(new object[] { "李四","男",100 });
 dt.Rows.Add(new object[] { "李四","女",90 });
 dt.Rows.Add(new object[] { "王五","女",77 });
 DataTable dtResult = dt.Clone();
 DataTable dtName = dt.DefaultView.ToTable(true, "name","sex");
 for (int i = 0; i < dtName.Rows.Count; i++)
 {
     DataRow[] rows = dt.Select("name='" + dtName.Rows[i][0] + "' and sex='" + dtName.Rows[i][1] + "'");
     //temp用来存储筛选出来的数据
     DataTable temp = dtResult.Clone();
     foreach (DataRow row in rows)
     {
         temp.Rows.Add(row.ItemArray);
     }
 
    DataRow dr = dtResult.NewRow();
     dr[0] = dtName.Rows[i][0].ToString();
     dr[1] = temp.Compute("sum(score)", "");
     dtResult.Rows.Add(dr);
 
} 
 
3、使用linq to DataTable group by实现
 var query = from t in dt.AsEnumerable()
             group t by new { t1 = t.Field<string>("name"), t2 = t.Field<string>("sex") } into m
             select new
             {
                 name = m.Key.t1,
                 sex = m.Key.t2,
                 score = m.Sum(n => n.Field<decimal>("score"))
             };
 if (query.ToList().Count > 0)
 {
     query.ToList().ForEach(q =>
     {
         Console.WriteLine(q.name + "," + q.sex + "," + q.score);
     });
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值