0

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

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

这是我目前拥有的

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;
}

我有以下列, BakerP, FlourP, BatchP, 如何使用下面的代码和 Linq 获取每列的值并将其保存到数据表中?

4

1 回答 1

0

我不知道 data types BakerP, FlourP, orBatchP是什么,所以下面只列出了一些选项:

如果字段是数字,并且您想像计算权重一样对它们进行汇总,您将执行与权重相同的操作,以便将这些字段添加到行中:

 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() 等) 因此,如果您希望在输出中添加这些附加字段,您需要决定要以哪种方式处理它们。

于 2013-11-13T21:01:31.227 回答