c# 使用 linq 查询获取多个 datagridview 列值的总和

问题描述 投票:0回答:2

我正在尝试计算 datagridview 中多列的总和,然后获取平均值。

此列包含一些值,例如“3x8”(用于锻炼训练),我想计算多列的第一个值 (3) 的总和

我发现的唯一结果是获得像这样的字符串总和。所以如果我第一列有 3x8,第二列有 3x8,结果就是 33。自然,我想得到 6。

这是我的 datagridview 示例:

    Group   Val1 to sum    Val2 to sum
-------------------------------------
group1       3x8              3x8
-------------------------------------
group1       1x5              5x5
-------------------------------------
group3       2x20             2x10
-------------------------------------

这是我正在使用的代码:

var Su = dataGridView1.Rows.Cast<DataGridViewRow>()
      .Where(row => row.Cells["Group"].Value != null)
      .Where(row => row.Cells["Val1"].Value != null)
      .GroupBy(row => row.Cells["Group"].Value.ToString())
    .Select(g => new
    {
        Group = g.Key,
        Sum = g.Sum(row => {
            int sum = 0;
            if (row.Cells["week1"].Value.ToString().Contains("x"))
            {
                Debug.WriteLine("true condition 1");
                sum += (Convert.ToInt32(row.Cells[1].Value.ToString().Split('x')[0] + row.Cells[2].Value.ToString().Split('x')[0])) ;
                return sum;
            }
            else {
                Debug.WriteLine("true else");
                return 0; }
        })

有办法做到这一点吗?

c# linq datagridview
2个回答
0
投票

您只需解析单元格的内容以符合您的 0x0 模式,然后将解析的数字相加。有很多方法可以做到这一点。如果它不是 datagridviewrows,而只是一个数据数组,它可能看起来像这样,可以想象很多变体:

     var gridsRows = new ITuple[] { // using value tuples
            ("group1", "3x8", "3x8"),
            ("group1", "1x5", "5x5"),
            ("group3",  "2x20", "2x10"),
            ("group4",  "14x4", "-")
        };  
    
     var parser = new Regex (@"^\s*(\d+)x\d+\s*$", RegexOptions.Compiled);

     var groupedSums = new Dictionary<string, int>(gridsRows
                .GroupBy(row => (string)row[0], (key, rows) => new KeyValuePair<string, int>(key, 
                         rows.Sum(r => ValOrZero(1, r) + ValOrZero(2, r)))));
          
      foreach (var sum in groupedSums)
          Console.WriteLine("{0}: {1,4}", sum.Key, sum.Value);

      /* Prints:
        group1:   12
        group3:    4
        group4:   14
      */
        
      int ValOrZero(int columnIndex, ITuple row) {
            return row[columnIndex] is string val
                && parser.Match(val) is { Success: true} m
            ?  int.Parse(m.Groups[1].Value) : 0;
      } 

“翻译”回 WinForms DataGridView:

 var parser = new Regex (@"^\s*(\d+)x\d+\s*$", RegexOptions.Compiled);

 var groupedSums = new Dictionary<string, int>( dataGridView1.Rows.Cast<DataGridViewRow>()
  .Where(row => row.Cells[0].Value != null)
  .Where(row => row.Cells[1].Value != null)
            .GroupBy(row => row.Cells[0].Value.ToString(), (key, rows) => new KeyValuePair<string, int>(key, 
                     rows.Sum(r => ValOrZero(1, r) + ValOrZero(2, r)))));
      
  foreach (var sum in groupedSums)
      Console.WriteLine("{0}: {1}", sum.Key, sum.Value);
    
  int ValOrZero(int columnIndex, DataGridViewRow row) {
        return row.Cells[columnIndex].Value?.ToString() is {} val
            && parser.Match(val) is { Success: true} m
        ?  int.Parse(m.Groups[1].Value) : 0;
  }

0
投票

我同意第一个答案。只需要解析单元格的内容以符合您的 0x0 模式,然后将 paJrsed 的数字相加即可。

© www.soinside.com 2019 - 2024. All rights reserved.