2016-06-10 5 views
1

Ich habe folgende Datenstruktur:Finden Sie heraus, welche Spieler ich bereits getroffen habe

public class Match 
{ 

    public List<Player> Participants; 

} 

public class Player 
{ 

    public string Name; 

} 

Jetzt habe ich die folgenden Beispieldaten:

Match 1 
- PlayerA 
- PlayerB 
- PlayerC 

Match 2 
- PlayerA 
- PlayerB 
- PlayerD 
- PlayerE 

auf diese Daten zufolge, wenn PlayerA wollen würde weiß, mit welchen Spielern er gespielt hat, wäre die Antwort PlayerB, PlayerC, PlayerD and PlayerE.

Meine Frage ist nun, was die die Logik und einfach zu Abfrage Datenstruktur wäre, wenn ich zeigen wollen, die Spieler gespielt, mit denen und , wie oft. Schließlich möchte ich den Benutzer ein Diagramm, wie dies zeigen (über Farbe Fähigkeiten):

Chart

+0

jeder Spieler eine 'Liste ' des Namens beibehalten/Id von denen, die sie getroffen haben. Für * wie oft * müsste "T" einen Zähler enthalten – Plutonix

Antwort

2

Als 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()  

Prüfung mit Vorschlag, um Ihre Lösung besser zu machen, haben Player überschreiben gleich. Der Code sieht wie folgt aus:

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; 
} 

Dies Sie eine viel lesbarer Gegner Findung Lösung machen können, entlang der Linien dieser

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

Sie dies tun könnte, diese Demo

Verwandte Themen