Vb.net 如何正确使用List(Of T).Contains方法?
我正在努力找出如何搜索一个特定复选框名称的列表(复选框)。我想搜索现有列表,并添加复选框,将特定名称与另一个列表相匹配。在现有列表中,我添加了带有名称的复选框,如:chkClass11、chkClass12、chkClass21等 我的代码如下: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 <=
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”