DataTable中的组数据

时间:2017-04-04 07:55:48

标签: c# sql linq datatable

我从Excel文件中获得了一个数据表。现在,我想总结按块,移植和品种分组的数据表的Quantity1和Quantity2列。有可能这样做吗?

这是我从Excel文件中获取的数据表:

enter image description here

这就是我需要的结果:

enter image description here

2 个答案:

答案 0 :(得分:4)

这应该让你开始。请注意,以下代码是在Linqpad中编写的,因此.Dump()只能在那里工作。您应该在生产中用DateTime替换Transplant类型。为简单起见,我把它留作字符串。

DataTable dt = new DataTable(); 
dt.Clear();
dt.Columns.Add("Block");
dt.Columns.Add("Transplant");
dt.Columns.Add("Variety");
dt.Columns.Add("Quantity1");
dt.Columns.Add("Quantity2");


object[] r1 = {"A", "04/04/2017", "ROSE", 11, 11};
object[] r2 = {"A", "04/04/2017", "ROSE", 21, 11};
object[] r3 = {"B", "14/04/2017", "MN", 231, 11};
object[] r4 = {"A", "24/04/2017", "GG", 11, 11};
object[] r5 = {"A", "24/04/2017", "GG", 21, 21};

dt.Rows.Add(r1);
dt.Rows.Add(r2);
dt.Rows.Add(r3);
dt.Rows.Add(r4);
dt.Rows.Add(r5);
dt.Dump();

var grouped = dt.AsEnumerable().GroupBy (d => new 
              { 
                    block = d.Field<string>("Block"), 
                    transplant = d.Field<string>("Transplant"), 
                    variety = d.Field<string>("Variety") 
              })
              .Select(x => new {
                    Block = x.Key.block,
                    Transplant = x.Key.transplant,
                    Variety = x.Key.variety,
                    //replace ItemArray Index with appropriate values in your code
                    Q1 = x.Sum(y => int.Parse(y.ItemArray[3].ToString())),
                    Q2 = x.Sum(y => int.Parse(y.ItemArray[4].ToString())),
                });
grouped.Dump();

输出:

enter image description here

第一个表是原始源数据,第二个表显示了它的结果。

答案 1 :(得分:2)

编辑了答案,因为我对要求的理解不正确,我们需要使用列 - Block (string),Transplant(Datetime),Variety(string)进行GroupBy并创建Quantity1 (int),Quantity2 (int)的总和

以下代码应该有帮助(它使用Linq API):

var groupingResult =
dt.AsEnumerable().GroupBy(row => new {Block = (string)row["Block"] , Transplant = (DateTime)row["Transplant"], Variety = (string)row["Variety"]},row => new {Sum = (int)row["Quantity1"] + (int)row["Quantity2"]});

这将提供结果数据结构,如:

IEnumerable<IGrouping<<Anonymous type: string Block,DateTime Transplant,string Variety>,<Anonymous type: int Sum>>>

现在您可以将其转换为IEnumerable,如下所示:

var resultData = groupingResult.Select(grp => new {grp.Key.Block,grp.Key.Transplant,grp.Key.Variety,Sum = grp.Sum(r => r.Sum)});

属于IEnumerable<<Anonymous type: string Block,DateTime Transplant,string Variety,int Sum>>

的类型

它由列Block (string), Transplant (DateTime), Variety (string), Sum (int)

组成