2015-06-28 68 views
0

考慮此示例的Stackoverflow標記。假設我有兩類:如何根據另一個List(Of Class)檢查特定列是否在List(Of Class)中具有特定值?

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將只包含爲這輛車選擇的標籤。

第二類是已建成,與選擇的默認值。

我需要回到我的應用程序是AllTags數據,但我需要根據是否存在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的例子,使用。載,.Find。函數()等

回答

1

你班的名字沒有多大意義。即使每個只存儲一個標籤的數據,也可以稱它們爲​​和AllTags。所以,我的答案的目的,我將分別稱它們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 
+0

對,你的嵌套循環正是我所做的。對於這些班級所缺乏的理解抱歉。鑑於我在做什麼的獨特設置,這是必要的,但很難解釋。我的目標是讓它更加優化,並且看起來你確切地知道我需要什麼。現在嘗試Linq。 – user1447679

+0

與Linq完美合作。你認爲這比嵌套循環更有效嗎?嵌套循環看起來有點過分,但也許這在幕後做了同樣的事情? – user1447679

+0

是的。它本質上是在幕後做同樣的事情。 LINQ通常只不過是幫助保持代碼簡潔易讀的捷徑,但嵌套循環方法本身並沒有錯。 –

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 

你並不需要一個單獨的類選定代碼此示例顯示如何更改所選列表中的引用並將其反映到原始列表中。沒有循環任何事情。

希望這對你有幫助,我不確定我是否明白你在做什麼。

相關問題