我尝试搜索并没有成功解决问题,所以我尝试找到自己的解决方案。
首先我发现max(Max)值(min值始终为1),然后我将循环设置为按值搜索值,但是我的循环出错了。
For i As Integer = 1 To Max
For y As Integer = 0 To DataGridView1.Rows.Count - 1
If DataGridView1.Rows(y).Cells(0).Value = i Then
Else
builder2.Append(i & ",")
End If
Next
Next
对我来说循环看起来还不错,但它不起作用。如果找到值i
,则无法找不到i
添加stringbuilder
到Max
,依此类推,直至达到{{1}}值。但无论我尝试过什么组合,我都会得到一些奇怪的结果。
数字从最低到最高排序。
我还将所有值从DGV列提取到逗号分隔的字符串,如果它更容易...
编辑: 只是为了试验这个循环,我把i = 40到50(减小范围)。我知道DGV栏中的缺失值是40-46和59。 这就是我上面的循环:
答案 0 :(得分:1)
您可以使用LINQ轻松找到丢失的号码。您只需将现有数字放入列表中,然后就可以使用Max()
查找最大数字,并使用Except()
查找丢失的数字。
我在一个新的Windows窗体上放了一个名为DataGridView1的DGV和一个列,一个名为bnPopulateDGV的按钮,以及一个名为bnFindMissingNumbers的按钮,并使用了以下代码(带Option Infer On
):
Private Sub bnPopulateDGV_Click(sender As Object, e As EventArgs) Handles bnPopulateDGV.Click
DataGridView1.Rows.Clear()
Dim seq1 = Enumerable.Range(1, 100).ToList()
Dim rand As New Random
' knock some out
For i = 1 To 5
seq1.RemoveAt(rand.Next(0, 50))
Next
For Each s In seq1
DataGridView1.Rows.Add(New String() {s.ToString()})
Next
End Sub
Private Sub bnFindMissingNumbers_Click(sender As Object, e As EventArgs) Handles bnFindMissingNumbers.Click
Dim existingNumbers As New List(Of Integer)
For Each r As DataGridViewRow In DataGridView1.Rows
existingNumbers.Add(CInt(r.Cells(0).Value))
Next
Dim min = 1
Dim max = existingNumbers.Max()
Dim missingNumbers = Enumerable.Range(min, max - min + 1).Except(existingNumbers)
MsgBox("Missing: " & String.Join(", ", missingNumbers))
End Sub