c#DataTable:更高效的Group By和Sum?

时间:2016-02-12 09:44:36

标签: c# datatable group-by sum

我合并了两个相似的表,其中我有2个字段(ID和Quantity),最后得到一个表,我可以为同一个ID创建多个记录。我希望结果表每个ID只有1条记录,同时为每个ID提供各自的数量。经过长时间的谷歌搜索,我想出了这段代码:

    DataTable dt1 = new DataTable("Table1");
    DataTable dt2 = new DataTable("Table2");

    dt1.Columns.Add("ID", typeof(Int32));
    dt1.Columns.Add("Quantity", typeof(Int32));
    dt1.Rows.Add(new object[] { 1, 1 });
    dt1.Rows.Add(new object[] { 2, 2 });
    dt1.Rows.Add(new object[] { 3, 3 });
    dt1.Rows.Add(new object[] { 4, 4 });

    dt2.Columns.Add("ID", typeof(Int32));
    dt2.Columns.Add("Quantity", typeof(Int32));
    dt2.Rows.Add(new object[] { 1, 100 });
    dt2.Rows.Add(new object[] { 3, 100 });
    dt2.Rows.Add(new object[] { 4, 100 });

    dt1.Merge(dt2);

    var datas = dt1.AsEnumerable()
       .GroupBy(r => new { Col1 = r["ID"] })
       .Select(g => g.First()["Quantity"] = g.Sum(x => int.Parse(x["Quantity"].ToString())))
       .ToList();

    dt1 = dt1.AsEnumerable().GroupBy(r => new { Col1 = r["ID"] })
        .Select(x => x.First()).CopyToDataTable();

但是,我觉得有一种方法可以更有效地执行此操作,因为在这种情况下,表会被扫描两次。有没有人有任何建议?

还有一件事,作为一个奖励问题,我希望在整个结果表中找到总数量,理想的是以有效的方式(即WHILE分组)。

更新:是的我知道,DataTable不是一个明智的数据结构,但由于我们项目的性质,我不得不与他们合作。我非常感谢有关如何在这里使用中间数据结构的建议,但最后我需要一个DataTable。

1 个答案:

答案 0 :(得分:1)

//your method
public void YourMethod()
{
     Dictionary<int, int> result = new Dictionary<int, int>();

     int length = 0;

     if(dt1.Rows.Count > dt2.Rows.Count)
        length = dt1.Rows.Count
     else
         length = dt2.Rows.Count

     for(int i=0; i < length - 1; i++)
     {
         AddRowValue(dt1, result, i);
         AddRowValue(dt2, result, i);
     }  

}


public AddRowValue(DataTable tbl, Dictionary<int, int> dic, int index)
{
    if( index > tbl.Rows.Count)
       return;

    DataRow row = tbl.Rows[index];

    int idValue = Convert.ToInt32(row["ID"]);
    int quantityValue = Convert.ToInt32(row["Quantity"]);

    if(dic.Keys.Contains(idValue)
         dic[idValue] = dic[idValue] + quantityValue;
    else
         dic.Add(idValue, quantityValue);
}

你需要这样的东西,你可以在结尾使用字典,结果将存储在字典中。