2013-03-18 154 views
2

我有以下對象結構轉換嵌套的for循環到LINQ

一組具有很多球隊和一支球隊有很多球員

m_Groups是羣體

的觀察集合

我想獲得球隊名稱給定一個組名和一個球員的名字 我可以做到這一點像每個,但無法將其轉換爲LINQ:

Dim retVal As String = String.empty 

For Each g In m_Groups 
    For Each t In g.Teams 
    For Each p In t.Players 
     If p.PlayerName.Equals(name) Then 
     retVal = t.TeamName 
     End If 
    Next 
    Next 
Next 

回答

1

有這樣做的明顯幾種方法,這裏是來到我的腦海

var team = m_Groups 
     .SelectMany(g=>g.Teams) 
     .FirstOrDefault(t=>t.Players.Any(p=>p.PlayerName == name)); 

我希望你能夠把它轉換到VB自己

2
Dim teamName = (From group in Groups _ 
       From team In group.Teams _ 
       From player In team.Players _ 
       Where player.PlayerName.Equals(name) _ 
       Select team.TeamName).FirstOrDefault() 

(聲明:我m主要是猜測上面的VB語法。)

另外,我處理像youre這樣的情況的實際方法是給玩家一個Team屬性,並在加載後連接它們一次,而不是每次都進行查找。 (假設玩家分配不改變,雙向連接需要一些樣板文件來維護。)

1

使用您的設置,我假設您每次需要搜索特定團隊時都會執行LINQ查詢。更好的方法是建立一個線性結構,如字典,其中name爲關鍵字。

保持接近你得到了什麼沒有,這裏是一些代碼一起玩:

Option Strict On 

Public Class Form1 
    Class MyGroup 
    Public Teams As New List(Of MyTeam) 
    End Class 
    Class MyTeam 
    Public Players As New List(Of MyPlayer) 
    Public TeamName As String 
    End Class 
    Class MyPlayer 
    Public PlayerName As String 
    End Class 

    Dim m_Groups As New List(Of MyGroup) 

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
    Dim p As New MyPlayer With {.PlayerName = "Player"} 
    Dim t As New MyTeam With {.TeamName = "Team", .Players = New List(Of MyPlayer)({p})} 
    m_Groups.Add(New MyGroup With {.Teams = New List(Of MyTeam)({t})}) 
    Dim name As String = "Player" 'player name to be searched 

    Dim teamName = (From group In m_Groups _ 
        From team In group.Teams _ 
        From player In team.Players _ 
        Where player.PlayerName.Equals(name) _ 
        Select team.TeamName).FirstOrDefault() 
    End Sub 
End Class 

它深受@ millimoose的回答的影響,有兩個細微的變化:

  1. Dim team - >Dim teamName,在同一範圍內不能有兩個team變量。
  2. OP想要團隊名稱,所以Select player成爲Select team.TeamName