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 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);
});
}
收集整理,非原创
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>