如何根据另一个List(Of Class)检查特定列是否在List(Of Class)中具有特定值?

时间:2015-06-28 20:17:48

标签: vb.net

考虑此示例的Stackoverflow标记。假设我有两个类:

Public Class SelectedTags

    Public Property TagID As Integer
        Get ...
        Set ...
    End Property

    Public Property Name As String
        Get ...
        Set ...
    End Property

End Class


Public Class AllTags

    Public Property TagID As Integer
        Get ...
        Set ...
    End Property

    Public Property Name As String
        Get ...
        Set ...
    End Property

    Public Property Selected As Boolean
        Get ...
        Set ...
    End Property
    Private _Selected As Boolean = False

End Class

所以,如果我有一个物体,那么就说一辆车。上面的第一个类,SelectedTags将只包含为此车选择的标签。

已经构建了第二个类, 选择 的默认值为 False

我需要返回我的应用程序的是 AllTags 数据,但我需要根据 TagID 是否设置已选择属性在 SelectedTags 。我觉得我在为每个循环嵌套了几个错误......

伪逻辑:

For Each Tag In AllTags
    If Tag.TagID can be found in SelectedTags Then
        Update this one and set Selected = True
    End If        
End For

与Linq的例子有点混淆,并使用.Contains,.Find,.Function()等。

2 个答案:

答案 0 :(得分:1)

你的课程名称没有多大意义。您将它们称为SelectedTagsAllTags,即使每个只存储单个标记的数据。因此,就我的回答而言,我将分别称他们为TagSelectableTag

Public Class Tag
    Public Property TagID As Integer
    Public Property Name As String
End Class

Public Class SelectableTag
    Public Property TagID As Integer
    Public Property Name As String
    Public Property Selected As Boolean = False
End Class

然后我假设您有两个这样的列表:

Dim tags As New List(Of Tag)()
Dim selectableTags As New List(Of SelectableTag)()

鉴于设置,您可以使用嵌套循环执行所需的操作:

For Each selecableTag As SelectableTag In selectableTags
    For Each tag as Tag in tags
        If tag.TagID = selectableTag.TagID Then
            selectableTag.Selected = True
            Exit For
        End If
    Next
End For

但是,正如您所建议的那样,使用LINQ可以实现同样的目的。例如,LINQ提供Any扩展方法:

For Each selecableTag As SelectableTag In selectableTags
    selectableTag.Selected = tags.Any(Function(x) x.TagID = selectableTag.TagID)
End For

答案 1 :(得分:0)

这将在AllTags中找到每个选定的标签并将其设置为true,我认为这就是你所要求的。

For Each SelectedTag As SelectedTags In SelectedTagsList
  For Each Tag As AllTags In AllTagsList
    If Tag.TagID = SelectedTag.TagID Then
      'Found the right tag
      Tag.Selected = True
      Exit For 'No need to keep going in this loop
    End If
  Next
Next

这可以通过一个(AllTags)列表更好地实现,然后在构建所选标签列表时,只需构建另一个列表(AllTags),并添加AllTags作为引用。然后,您可以更改所选值,它将反映在两个列表中。这意味着你不必遍历每一个并将它与选定的列表进行比较,如果它们的结构与AllTags相同,则不需要为选定的标记单独的类

Dim AllTagsList As New List(Of AllTags)
AllTagsList.Add(New AllTags())

Dim selectedTags As New List(Of AllTags)
selectedTags.Add(AllTagsList(0)) 'This is a reference to the first item in the AllTagsList

selectedTags(0).Selected = True 'Changing this value changes it for both lists

Dim outcome As Boolean = AllTagsList(0).Selected 'This will also be true now

此示例显示如何更改所选列表中的引用并将其反映在原始列表中。没有循环任何东西。

希望这对你有帮助,我不确定我是否明白你在做什么。