兩種方式:
第一種,Linq
void Main() { var dt=new DataTable(); dt.Columns.Add("medicID"); dt.Columns.Add("price"); dt.Columns.Add("num",typeof(int)); dt.Columns.Add("unit"); dt.Rows.Add("0001","1.2",10,"盒"); dt.Rows.Add("0001","1.2",15,"盒"); dt.Rows.Add("0002","14",15,"支"); dt.Rows.Add("0003","10",10,"盒"); dt.Rows.Add("0002","14",10,"盒"); var query=dt.AsEnumerable() .GroupBy(d=>new {medicID=d.Field<string>("medicID"),price=d.Field<string>("price"),unit=d.Field<string>("unit")}) .Select(g=>new{ medicID=g.Key.medicID, price=g.Key.price, num=g.Sum(d=>d.Field<int>("num")), unit=g.Key.unit }); }
第二種,Datatable
public DataTable dtgourpsum(DataTable dt) { //初始化列 DataRow[] rows = dt.Select(null, "ProductCode"); int length = rows.Length; string ProductCode = null; for (int i = dt.Rows.Count - 1; i >= 0; i--) { //DataRow row = rows[i]; if (dt.Rows[i]["ProductCode"].ToString() != ProductCode)//如果1個列中有不同的,則為新的分組,重新記錄1個列的值到臨時變量 { ProductCode = dt.Rows[i]["ProductCode"].ToString(); } else { dt.Rows[i]["OerderNumber"] = Convert.ToInt32(dt.Rows[i + 1]["OerderNumber"].ToString()) + Convert.ToInt32(dt.Rows[i]["OerderNumber"].ToString());//將上一個行的OerderNumber列和當前行的OerderNumber相加,記錄到當前行中。 dt.Rows.RemoveAt(i+1);//將上一行從原來的DataTable中移除。 } } return dt; }
最快的做法不是Linq,而是先排序后相加並刪除后面相同的行來處理,Linq在這里將非常低效,推薦使用第二種方法。
轉自CSDN,原文鏈接:https://bbs.csdn.net/topics/390063982