我有以下对象结构
一个小组有很多小组,一个小组有很多玩家
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
答案 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的回答影响很大,有两处小小的变化:
Dim team
- > Dim teamName
,您不能在同一范围内拥有两个team
个变量。Select player
成为Select team.TeamName
。