当前位置:编程学习 > C#/ASP.NET >>

DataTable 如何实现分组求和



      DataTable dt= new DataTable();
            dt.Columns.Add("c1", typeof(int));
            dt.Columns.Add("c2", typeof(string));
            dt.Columns.Add("c3", typeof(int));
       

            dt.Rows.Add(1, "技术部", 130, 10);
            dt.Rows.Add(2, "产品部", 200, 20);

            dt.Rows.Add(3, "市场部", 130, 30);
            dt.Rows.Add(3, "市场部", 30, 30);


我要得到
技术部 130
产品部 200
市场部  160
的结果
           
 google了一把,
        IEnumerable<IGrouping<string, DataRow>> result = dt.Rows.Cast<DataRow>().GroupBy<DataRow, string>(r => r.Field<string>("c2")) 只实现了分组,不知道完整的代码怎么写?
--------------------编程问答--------------------

void Main()
{
DataTable dt= new DataTable();
dt.Columns.Add("c1", typeof(int));
dt.Columns.Add("c2", typeof(string));
dt.Columns.Add("c3", typeof(int));
   

dt.Rows.Add(1, "技术部", 130);
dt.Rows.Add(2, "产品部", 200);

dt.Rows.Add(3, "市场部", 130);
dt.Rows.Add(3, "市场部", 30);

var query= dt.AsEnumerable().GroupBy(t=>t.Field<int>("c1"))
          .Select(g=>new {
     c1=g.Key,
 c2=g.First().Field<string>("c2"),
 c3=g.Sum(m=>m.Field<int>("c3"))
  });
  
DataTable dtResult=dt.Clone();
query.ToList().ForEach(q=>dtResult.Rows.Add(q.c1,q.c2,q.c3));
 
          
}
--------------------编程问答--------------------

DataTable dt= new DataTable();
dt.Columns.Add("c1", typeof(int));
            dt.Columns.Add("c2", typeof(string));
            dt.Columns.Add("c3", typeof(int));
            dt.Columns.Add("c4", typeof(int));

            dt.Rows.Add(1, "技术部", 130, 10);
            dt.Rows.Add(2, "产品部", 200, 20);

            dt.Rows.Add(3, "市场部", 130, 30);
            dt.Rows.Add(3, "市场部", 30, 30);

               IEnumerable<IGrouping<string, DataRow>> result = dt.Rows.Cast<DataRow>().GroupBy<DataRow, string>(r=>r.Field<string>("c2"));
   
 foreach (IGrouping<string, DataRow> ig in result)
    {
 Console.Write(ig.Key + ":");
 
 Console.WriteLine(ig.Sum(r=>r.Field<int>("c3")));
}




这样可以运行,不过有两个问题
1  
IEnumerable<IGrouping<string, DataRow>> result = dt.Rows.Cast<DataRow>().GroupBy<DataRow, string>(r=>r.Field<string>("c2"));
   这句完了只是分组,能在这句代码中直接完成求和吗?不是用linq的写法,就是调用方法的写法
2 如果添加列不指定字段类型的话,比如这样写
DataTable dt= new DataTable();
dt.Columns.Add("c1");
            dt.Columns.Add("c2");
            dt.Columns.Add("c3");
            dt.Columns.Add("c4");

运行就会报错 技术部:
未经处理的异常:  System.InvalidCastException: 指定的转换无效。
   在 System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value)


--------------------编程问答-------------------- 类型不明确,那就在代码中进行类型转换呗:

var query= dt.AsEnumerable().GroupBy(t=>t.Field<int>("c1"))
                      .Select(g=>new {
                         c1=g.Key,
                         c2=g.First().Field<string>("c2"),
                         c3=g.Sum(m=>Convert.ToInt32(m.Field<int>("c3")))
                      });
--------------------编程问答-------------------- --------------------编程问答--------------------
   static void Main()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("c1", typeof(int));
            dt.Columns.Add("c2", typeof(string));
            dt.Columns.Add("c3", typeof(int));


            dt.Rows.Add(1, "技术部", 130);
            dt.Rows.Add(2, "产品部", 200);

            dt.Rows.Add(3, "市场部", 130);
            dt.Rows.Add(3, "市场部", 30);

            var query = from d in dt.AsEnumerable()
                        group d by d.Field<string>("c2") into g
                        select new
                        {
                            c2 = g.Key,
                            c3 = g.Sum(t => t.Field<int>("c3"))
                        };
            query.ToList().ForEach(q => Console.WriteLine("{0},{1}", q.c2, q.c3));
        }
--------------------编程问答--------------------

static DataTable Test() {
DataTable dt = new DataTable();
dt.Columns.Add("c1", typeof(int));
dt.Columns.Add("c2", typeof(string));
dt.Columns.Add("c3", typeof(int));
dt.Columns.Add("c4", typeof(int));


dt.Rows.Add(1, "技术部", 130, 10);
dt.Rows.Add(2, "产品部", 200, 20);

dt.Rows.Add(3, "市场部", 130, 30);
dt.Rows.Add(3, "市场部", 30, 30);
var r = dt.GroupBy(new ColSets[] { "c2" }, "SUM(Child.c3)");
return r;
}

引用我传上来的库Sys Library,在我的资源里面下载。
http://download.csdn.net/user/yyz985。刚刚上传,可能还没出来 --------------------编程问答--------------------


dt.Rows.Cast<DataRow>().GroupBy<DataRow, string>(row => Convert.ToString(row["c2"])).Select(group => new { group.Key, Value = group.Sum(x => Convert.ToInt32(x["c3"])) });


这个可以,不过这个的类型是什么,应该赋给什么样类型的变量 ? --------------------编程问答-------------------- 我是来看督查写LINQ的,只要有LINQ的地方,就能看到督查, --------------------编程问答-------------------- csdn资源上传不上去。
http://dl.dbank.com/c0af1zaq38
3.5框架写的 --------------------编程问答--------------------
引用 9 楼 yyz985 的回复:
csdn资源上传不上去。
http://dl.dbank.com/c0af1zaq38
3.5框架写的

好宝贝啊。。。。 --------------------编程问答-------------------- var newDT = from detail in dt.AsEnumerable()
                         group detail by detail["c1"] into g
                         select new { c1 = g.Key, c2 = g.Select(m => m["c2"]).First(), c3 = g.Sum(m => m.Field<int>("c3")) };



呵呵。。。 --------------------编程问答-------------------- 古老的问题

看这里吧
bbs.csdn.net/topics/390403648

用linq和不用linq的解法都在
补充:.NET技术 ,  LINQ
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,