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);
});
}
收集整理,非原創