《c#用datatable实现groupby数据统计》由会员分享,可在线阅读,更多相关《c#用datatable实现groupby数据统计(3页珍藏版)》请在金锄头文库上搜索。
1、C#用DataTable实现Group by数据统计 2013-04-04 00:53 471人阅读 评论(0) 收藏 举报 1、用两层循环计算,前提条件是数据已经按分组的列排好序的。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
2、 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.Row
3、si name .ToString();string sex = dt.Rowsi sex .ToString(); dr name = name;dr sex = sex; int score = 0 ; / 内层也是循环同一个表,当遇到不同的name时跳出内层循环 for (; i dt.Rows.Count; ) if (name = dt.Rowsi name .ToString()& name = dt.Rowsi sex .ToString() ) score += Convert.ToInt32(dt.Rowsi score ); dr score = score; i+; el
4、se 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.
5、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 ;
6、 i dtName.Rows.Count; i+) DataRow rows = dt.Select( name= + dtName.Rowsi 0 + and sex= + dtName.Rowsi1 + ); / temp用来存储筛选出来的数据 DataTable temp = dtResult.Clone(); foreach (DataRow row in rows) temp.Rows.Add(row.ItemArray); DataRow dr = dtResult.NewRow(); dr 0 = dtName.Rowsi 0 .ToString(); dr 1 = temp.C
7、ompute( 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( name ), t2 = t.Field( sex ) into m select new name = m.Key.t1, sex = m.Key.t2, score = m.Sum(n = n.Field( score ) ; if (query.ToList().Count 0 ) query.ToList().ForEach(q = Console.WriteLine(q.name + , + q.sex + , + q.score); );