Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何正确使用List(Of T).Contains方法?_Vb.net_Visual Studio 2010_List - Fatal编程技术网

Vb.net 如何正确使用List(Of T).Contains方法?

Vb.net 如何正确使用List(Of T).Contains方法?,vb.net,visual-studio-2010,list,Vb.net,Visual Studio 2010,List,我正在努力找出如何搜索一个特定复选框名称的列表(复选框)。我想搜索现有列表,并添加复选框,将特定名称与另一个列表相匹配。在现有列表中,我添加了带有名称的复选框,如:chkClass11、chkClass12、chkClass21等 我的代码如下: Dim lstCheckboxes As New List(Of CheckBox) Dim lstGroupCheckboxes As New List(Of CheckBox) Do While intNextGroupNumber <=

我正在努力找出如何搜索一个特定复选框名称的列表(复选框)。我想搜索现有列表,并添加复选框,将特定名称与另一个列表相匹配。在现有列表中,我添加了带有名称的复选框,如:chkClass11、chkClass12、chkClass21等

我的代码如下:

Dim lstCheckboxes As New List(Of CheckBox)
Dim lstGroupCheckboxes As New List(Of CheckBox)

Do While intNextGroupNumber <= intTotalGroups
    Dim grpNewGroupBox = New GroupBox
    grpNewGroupBox.Name = "grpGroup" & intNextGroupNumber
    grpNewGroupBox.Text = "Group " & intNextGroupNumber
    grpNewGroupBox.Location = New Point(intCurrentXPosition, intCurrentYPosition)
    grpNewGroupBox.Size = New Size(intGroupBoxWidth, intGroupBoxHeight)
    grpNewGroupBox.AutoSize = True
    strGroupBoxNameAddArray(intArrayLocation) = "grpGroup" & intNextGroupNumber

    Do While intCurrentRow < intTotalRows
        Dim chkClassCheckBox = New CheckBox
        chkClassCheckBox.Name = "chkClass" & intNextGroupNumber & intCurrentRow
        chkClassCheckBox.Text = m_DataTableClass.Rows(intCurrentRow).Item("ClassName")
        chkClassCheckBox.Location = New Point(intCurrentXPosition, intCurrentCBYPosition)
        grpNewGroupBox.Controls.Add(chkClassCheckBox)
        lstCheckboxes.Add(chkClassCheckBox)
        intCurrentCBYPosition += 30
        intCurrentRow += 1
        intArrayLength += 1
    Loop

    Me.Controls.Add(grpNewGroupBox)

    strGroupNamesArray(1, intNextGroupNumber - 1) = grpNewGroupBox.Name ' Add group names to array to sort checked checkboxes into

    intCurrentRow = 0
    intNextGroupNumber += 1
    intCurrentGroupBoxHeight = grpNewGroupBox.Height
    intCurrentYPosition = intCurrentYPosition + intCurrentGroupBoxHeight + 50
    intCurrentCBYPosition = 15
    intArrayLocation += 1
Loop

intArrayLocation = 0

'Search strGroupBoxNameArray for next group and then insert strGroupBoxNameAddArray values
For Each Group In strGroupBoxNameAddArray
    intClassNumber = 1
    Try
        strGroupName = strGroupBoxNameAddArray(intArrayLocation)
        intGroupNumber = Microsoft.VisualBasic.Right(strGroupName, 1)

        If Not dicGroups.ContainsKey(Group) Then
            Do
                Try
                    strCheckBoxName = "chkClass" & intGroupNumber & intClassNumber
                    If lstCheckboxes.Contains(strCheckBoxName) Then
                        lstGroupCheckboxes.Add(lstCheckboxes.Item("chkClass" & intGroupNumber & intClassNumber))
                    Else
                        Exit Do
                    End If
                    intClassNumber += 1
                Catch
                    MessageBox.Show(ErrorToString)
                    Exit Do
                End Try
            Loop
            dicGroups.Add(Group, lstGroupCheckboxes)
        End If
        intArrayLocation += 1
    Catch
        MessageBox.Show(ErrorToString)
        Exit For
    End Try
Next
以下是:

Do
    Try
        strCheckBoxName = "chkClass" & intGroupNumber & intClassNumber
        If lstCheckboxes.Contains(strCheckBoxName) Then
            lstGroupCheckboxes.Add(lstCheckboxes.Item("chkClass" & intGroupNumber & intClassNumber))
        Else
            Exit Do
        End If
        intClassNumber += 1
    Catch
        MessageBox.Show(ErrorToString)
        Exit Do
    End Try
Loop
lstGroupCheckboxes.AddRange(lstCheckboxes.Where(Function(cb) cb.Name.StartsWith("chkClass" & intGroupNumber)))
但我的线路有点问题:

dicGroups.Add(Group, lstGroupCheckboxes)
我没有问题用列表LSTGroupCheckbox填充这个字典键,我只是有问题用新的列表LSTGroupCheckbox填充它。新列表的格式是否有问题?

使用.Where()或.Any()代替.Contains()。整个If块:

If lstCheckboxes.Contains(strCheckBoxName) Then
(整个块,而不仅仅是那条线)可以变成:

lstGroupCheckboxes.AddRange(lstCheckboxes.Where(Function(cb) cb.Name = strCheckBoxName))

替换整个Do。。。与此循环:

lstGroupCheckboxes.AddRange(lstCheckboxes.Where(Function(cb) cb.Name.StartsWith("chkClass" & intGroupNumber))

这将创建所有匹配复选框的列表:

lstCheckboxes.Where(function(x) x.Name=="chkClass" & intGroupNumber & intClassNumber).ToList()

是否可以向我们展示LST复选框的声明?您使用的是.net的哪个版本?为什么不使用linq呢?我已经添加了您请求的声明代码。我不太确定如何使用linq。我用的是VB 2010。你知道匈牙利符号不再被推荐了,对吧?微软自己的风格指南(匈牙利语是在那里发明的)没有明确建议不要使用它。我不知道我是少数使用匈牙利符号的人之一。我认为这会让以后在代码中更容易记住变量类型。为什么不推荐呢?如果我删除整个块,这段代码将使我处于无限循环中。当lstcheckbox不包含名为strCheckBoxName的复选框时,如何退出我的Do…循环?因为循环没有条件,所以有一个无限循环。退出Do代码是一种奇怪的编写方式。我建议完全删除循环,并修改我发布的代码以允许任何类编号。马上编辑显示这个,明白了。现在它更有意义了。我真的很难找到名单上的信息。你知道我在哪里可以找到更多关于这个的信息吗?我没能让这个工作。它给了我以下错误:“重载解析失败,因为无法使用这些参数调用可访问的“Where”