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框架写的 --------------------编程问答--------------------
好宝贝啊。。。。 --------------------编程问答-------------------- 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