2016-06-10 47 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