获取DataTable列的值并使用LINQ将其放入新的数据表C#中

时间:2013-11-13 17:49:25

标签: c# linq

我有一个用于存储配料食谱的数据。我有一些代码可以找到是否有相似的成分名称,如果有的话,我会将重量总结并添加到表中。

现在我希望能够添加一些表中也存在的其他列。

这是我目前拥有的

protected DataTable cleanDataTable(DataTable dt)
{

    var result = dt.AsEnumerable()
    .GroupBy(r => r.Field<string>("Ingredients"))
         .Select(g =>
         {
             var row = dt.NewRow();
             row.ItemArray = new object[]
                    {
                        g.Key, 
                        g.Sum(r => double.Parse(r.Field<string>("KG")))


                    };
             return row;
         }).CopyToDataTable();

    dt = result;
    return dt;
}

我有以下列,BakerPFlourPBatchP,如何使用Linq?下面的代码获取每列的值并将其保存到数据表中? / p>

1 个答案:

答案 0 :(得分:0)

我不知道BakerPFlourPBatchP是哪种数据类型,因此以下列出了一些选项:

如果这些字段是数字的,并且您希望按照权重进行总结,那么您可以使用权重执行相同的操作,以便将这些字段添加到行中:

 var row = dt.NewRow();
 row.ItemArray = new object[]
   {
      g.Key, 
      g.Sum(r => double.Parse(r.Field<string>("KG"))),
      g.Sum(r => double.Parse(r.Field<string>("BakerP"))), // assuming this is also a number saved as a string
      // etc.
   };
 return row;

如果它们不是数字,或者您不想对它们进行汇总,则可以对它们进行分组,就像使用“成分”一样:

.GroupBy(r => new { 
     Ingredients = r.Field<string>("Ingredients"), 
     BakerP = r.Field<string>("BakerP"),
     FlourP = r.Field<string>("FlourP"),
     BatchP = r.Field<string>("BatchP")
 })
.Select(g =>
     {
         var row = dt.NewRow();
         row.ItemArray = new object[]
            {
                g.Key.Ingredients, 
                g.Key.BakerP,
                g.Key.FlourP,
                g.Key.BatchP,
                g.Sum(r => double.Parse(r.Field<string>("KG")))
            };
         return row;
     }).CopyToDataTable();

或者你可以混合搭配,在一个领域进行分组,同时总结另一个领域。

关键是,因为您正在使用GroupBy,所以输出中的所有字段都需要成为您分组的一部分,或者以某种方式进行汇总(使用.Sum()或。 Average()或.Max()或.First()等。)因此,如果您希望输出中包含这些附加字段,则需要确定要处理它们的方式。