2013-03-18 82 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