2016-06-10 48 views
1

我有以下數據結構:找出哪些球員我已經見過

public class Match 
{ 

    public List<Player> Participants; 

} 

public class Player 
{ 

    public string Name; 

} 

現在,我得到下面的示例數據:

Match 1 
- PlayerA 
- PlayerB 
- PlayerC 

Match 2 
- PlayerA 
- PlayerB 
- PlayerD 
- PlayerE 

根據這個數據,如果PlayerA會想知道他打哪個球員的答案是PlayerB, PlayerC, PlayerD and PlayerE

我的問題是,現在什麼是最邏輯和易於查詢的數據結構,如果我想顯示哪個球員打了誰多久。畢竟我要顯示給用戶這樣的圖表(超級油漆技能):

Chart

+0

線具有每個球員保持一個'列表名稱' /他們見過的人的身份。對於*頻率*,'T'必須包含一個計數器 – Plutonix

回答

2

作爲建議讓您的解決方案更加整潔,讓播放器覆蓋Equals。代碼如下所示:

public class Player 
{ 
    public override bool Equals(object obj) 
    { 
     var other = obj as Player; 
     if (other == null) 
      return false; 
     return this.Name == other.Name; 
    } 

    public override int GetHashCode() 
    { 
     return this.Name.GetHashCode(); 
    } 

    public string Name; 
} 

這允許你做一個更可讀的對手調查解決方案,沿此

Player me = new Player { Name = "Me" }; 
var allMatches = new List<Match> 
{ 
    new Match 
    { 
     Participants = new List<Player> 
     { 
      me, 
      new Player { Name = "Some Other Dude"} 
     } 
    }, 

    new Match 
    { 
     Participants = new List<Player> 
     { 
      me, 
      new Player { Name = "My Rival" } 
     } 
    } 
}; 

var myMatches = allMatches.Where(m => m.Participants.Contains(me)).ToList(); 
var myOpponents = myMatches.SelectMany(m => m.Participants.Except(new [] {me})).Distinct(); 
0

你能做到這一點,利用Linq

List<List<Match> matches = ... 
string player = "playerA"; 

var coplayers = matches.Where(x=>x.Any(p=>p.Participants.Any(s=>s.Name == player))) // get all participants where group contains participant. 
      .SelectMany(x=> x.SelectMany(p=>p.Participants))       // get all participants where group contains participant. 
      .Where(x=>x.Name != player)            // List co participants 
      .GroupBy(x=>x.Name)              // Distinct by grouping on Name or(need to override equal) 
      .Select(x=>x.FirstOrDefault()) 
      .ToList()  

入住這Demo