考虑此示例的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()等。
答案 0 :(得分:1)
你的课程名称没有多大意义。您将它们称为SelectedTags
和AllTags
,即使每个只存储单个标记的数据。因此,就我的回答而言,我将分别称他们为Tag
和SelectableTag
:
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
此示例显示如何更改所选列表中的引用并将其反映在原始列表中。没有循环任何东西。
希望这对你有帮助,我不确定我是否明白你在做什么。