vb.net - 根据特定条件计算 Datagridview 中的所有重复数据并将其放在图表上

vb.net - count all duplicates data in Datagridview for certain criteria and put it on a chart

所以基本上我要做的是计算某个“column8”中的重复值,避免 column17 中为“NO”的行。 table 会是这样的:

column8 column17
014 NO
014
013 NO
013
014
017

我的代码如下所示:

For Count As Integer = 0 To DataGridView1.Rows.Count - 1
    If DataGridView1.Rows(Count).Cells("Column17").Value <> "NO" Then
        Chart1.Series(0).Points.AddXY(DataGridView1.Item(8, Count).Value, 
                                      DataGridView1.Item(8, Count).Value)
    End If
Next Count 

它得到了名字,但计数根本没有意义。我需要的结果是带有第 8 列名称的图表,有多少重复不包括第 17 列中有“否”的那些。像这样:

014 2
013 1
017 1

非常感谢您的帮助。谢谢!

您可以使用 LINQ 执行以下操作:

  1. 查询 DataGridViewRows
  2. Row 不为空,不是新行,并且相应的 Column17 值不是“NO”
  3. 按 Column8 值分组
  4. Return 第一组的 Column8 值以及计数

这将为您提供唯一值和所需的计数。例如:

Dim chartValues = From row In DataGridView1.Rows.OfType(Of DataGridViewRow)
                  Where
                      row IsNot Nothing AndAlso
                      Not row.IsNewRow AndAlso
                      Not row.Cells().Item("Column17").Value.Equals("NO")
                  Group By row.Cells().Item("Column8").Value Into rowGroup = Group
                  Order By rowGroup.Count() Descending
                  Select New With {
                      .Value = rowGroup.First().Cells("Column8").Value.ToString(),
                      .Count = rowGroup.Count()
                  }

我对图表控件不够熟悉,无法为您提供一个有把握的示例,但我认为您会以这种方式添加数据:

For Each chartValue In chartValues
    Chart1.Series(0).Points.AddXY(chartValue.Value, chartValue.Count)
Next

更新

根据 OP 的要求,这里是上述代码的 non-LINQ 版本 (sans-sort)

Dim chartValues = New Dictionary(Of String, Integer)()
For Each row In DataGridView1.Rows.OfType(Of DataGridViewRow)
    If (row Is Nothing OrElse row.IsNewRow OrElse row.Cells().Item("Column17").Value.Equals("NO")) Then
        Continue For
    End If

    Dim column8Value = row.Cells().Item("Column8").Value.ToString()
    If (chartValues.ContainsKey(column8Value)) Then
        chartValues(column8Value) += 1
    Else
        chartValues.Add(column8Value, 1)
    End If
Next