2

私は次のオブジェクト構造を持っています

グループには多くのチームがあり、チームには多くのプレーヤーがいます

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
4

3 に答える 3

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毎回ルックアップを行うのではなく、プレイヤーにプロパティを与え、ロード後に一度接続することです。(プレーヤーの割り当てが変更されないと仮定すると、双方向接続を維持するにはボイラープレートが必要になります。)

于 2013-03-19T01:53:44.043 に答える
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の回答に大きく影響されましたが、2つのわずかな変更があります。

  1. Dim team-> 、同じスコープに2つの変数を含めるDim teamNameことはできません。team
  2. OPはチーム名が欲しいので、にSelect playerなりましSelect team.TeamNameた。
于 2013-03-19T02:06:55.597 に答える
1

それを行うには明らかにいくつかの方法があります、これが私の頭に浮かんだことです

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

自分でVBに変換できるといいのですが

于 2013-03-18T23:42:57.870 に答える