假设我有一个包含以下数据的DataGridView:
2 x item1
4 x item2
1 x item3
我将从该数据中创建这样的列表的方向:
Dim counter = 0
Dim listbox As New ListBox 'to store items already scanned
listbox.Items.Clear() 'clear it on each new call
listbox.Items.Add("Test") ' add a dummy value to start the loop
For Each row In DataGridView1.Rows 'check each item in the datagridview
Dim ItemName = row.Cells(1).Value 'declare the initial itemName
Dim flag = True'set the continue bool to true
For Each LoggedItem In listbox.Items 'check each item in the listbox to see if it has been check already
If LoggedItem = ItemName Then
flag = False 'if the item has been checked set the continue bool flag to false to prevent it from adding and displaying the item again
End If
Next 'check next item in listbox
If flag Then
counter = 0 'reset item counter
For Each row2 In DataGridView1.Rows
Dim ItemName2 = row2.Cells(1).Value
If ItemName = ItemName2 Then
counter += 1 'checks each item in the datagridview again and counts how many matches it finds
End If
Next
listbox.Items.Add(ItemName) 'add scanned item to the already checked list
MsgBox(counter & " x " & ItemName) 'display item totals
End If
flag = True 'reset flag for next item
Next 'continuum to next item
它基本上说明了一个项目出现在列表中的次数,并显示了项目的次数和名称。
阅读第1行,"第1项和第34期;创建计数器,读取列表中的每个项目,当字符串匹配增量计数器时,转到下一个项目跳过已经计数的项目。
这是我到目前为止所做的,但似乎有点过于复杂。有没有办法更有效地做到这一点?
nu[1]
答案 0 :(得分:2)
如果你使用一点linq,你可以在一行中完成大部分工作。通过使用linq分组的可枚举集合,您可以获得不同的值列表及其计数,然后输出您喜欢的结果。这是一个winforms示例,您可以将其粘贴到新项目中以开始使用:
我用来设置测试的代码:
'Create DataGridView and add it to the form
Dim dgv As New DataGridView With {
.Location = New Point(50, 50),
.Size = New Size(150, 300),
.AllowUserToAddRows = False
}
dgv.Columns.Add("Column1", "Column 1")
Me.Controls.Add(dgv)
'Put some test data in it
Dim testValues As String() = {"item1", "item1", "item2", "item2", "item2", "item2", "item3"}
For Each testValue As String In testValues
dgv.Rows.Add(New String() {testValue})
Next
获取不同的值及其数量:
'Now to the question at hand...
Dim column1GroupedValues = dgv.Rows.OfType(Of DataGridViewRow).Select(Function(row) row.Cells(0).Value.ToString()).GroupBy(Function(x) x)
Dim outputString As New System.Text.StringBuilder
For Each grpVal In column1GroupedValues
outputString.Append(String.Format("{0} x {1}" & vbCrLf, grpVal.Count.ToString, grpVal.Key))
Next
MsgBox(outputString.ToString)
'Outputs:
'2 x item1
'4 x item2
'1 x item3
神奇的一切都发生在我们创建column1GroupedValues
的地方。我们告诉linq获取每行中第一个单元格的值,然后对它们进行分组。拥有该集合后,您就可以访问每个条目的Key
和Count
媒体资源,您可以按照自己需要的方式展示这些资源。