http://www.cnblogs.com/sydeveloper/archive/2013/03/29/2988669.html
?
?
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); ????}); }