我从Excel文件中获得了一个数据表。现在,我想总结按块,移植和品种分组的数据表的Quantity1和Quantity2列。有可能这样做吗?
这是我从Excel文件中获取的数据表:
这就是我需要的结果:
答案 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();
输出:
第一个表是原始源数据,第二个表显示了它的结果。
答案 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)