将嵌套的for循环转换为LINQ

时间:2013-03-18 23:34:07

标签: vb.net 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

3 个答案:

答案 0 :(得分: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()

(免责声明:我主要猜测上面的VB语法。)

另外,我处理像你这样的情况的实际方法是给玩家一个Team属性,并在加载后连接一次,而不是每次都进行查找。 (假设播放器分配没有改变,双向连接将需要一些样板来维护。)

答案 1 :(得分:1)

显然有几种方法可以做到,这就是我想到的

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

我希望你能够自己将它转换为VB

答案 2 :(得分: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