根据C#中数据表的计数进行分组

问题描述

我是linq的新手。

我有一个数据表,需要使用linq根据另一列更新一列。

我的价值

customer | value1  |  value2  | count
---------------------------------------- 
   A     |   sda   |  sdas    |  0
   A     |   sda   |  sdas    |  0
   B     |   sda   |  sdas    |  0
   B     |   sda   |  sdas    |  0
   B     |   sda   |  sdas    |  0
   C     |   sda   |  sdas    |  0

期望值

customer | value1  |  value2  | count
---------------------------------------- 
   A     |   sda   |  sdas    |  2
   A     |   sda   |  sdas    |  2
   B     |   sda   |  sdas    |  3
   B     |   sda   |  sdas    |  3
   B     |   sda   |  sdas    |  3
   C     |   sda   |  sdas    |  1

您能建议我上述数据表所需的linq吗?

解决方法

您没有提供代码,但我认为您正在寻找这样的东西:(假设您的DataTable被称为'dt')

foreach(DataRow dr in dt.Rows) // loop whole table
{
   //Find count of rows which has same value
    var count = dt.AsEnumerable().Where(i=> i["customer"] == dr["customer"] && i["value1"] == dr["value1"] && i["value2"] == dr["value2"]).Count();
    
    /Then update count column
    dr["count"] = count;
}

您可以遵循的另一种方法是在数据表中GroupBy多列。

 dt.AsEnumerable()
    .GroupBy(g => new {Customer = g["customer"],Value1 = g["value1"],Value2= g["value2"]})
    .Select(g=> 
    {
        var newRow = dtNew.NewRow();
        
        row["customer"] = g.Key.Customer;
        row["value1"] = g.Key.Value1;
        row["value2"] = g.Key.Value2;
        row["count"] = g.Count();
        
        return newRow;
    })
    .CopyToDataTable();

请参阅:How do I use SELECT GROUP BY in DataTable.Select(Expression)?