在数字序列中查找缺失值 - DGV列

时间:2014-10-08 19:17:05

标签: vb.net loops datagridview max

我尝试搜索并没有成功解决问题,所以我尝试找到自己的解决方案。

首先我发现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添加stringbuilderMax,依此类推,直至达到{{1}}值。但无论我尝试过什么组合,我都会得到一些奇怪的结果。

数字从最低到最高排序。

我还将所有值从DGV列提取到逗号分隔的字符串,如果它更容易...

编辑: 只是为了试验这个循环,我把i = 40到50(减小范围)。我知道DGV栏中的缺失值是40-46和59。 这就是我上面的循环: enter image description here

1 个答案:

答案 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