2017-01-01 7 views
0

ich eine Liste mit den folgenden Punkten habenDistinct oder Gruppe von Basierend auf zwei austauschbaren Säulen (LINQ)

enter image description here

Was würde ich tun möchte, ist eine Art von Gruppierung oder verschieden mit Linq ausführen basiert rein auf die Teamnamen. Für das angegebene Beispiel würde nur ein Datensatz zurückgegeben, da die gleichen Teams sich gegenseitig spielen, obwohl die Namen in verschiedenen Variablen im Datensatz gespeichert sind.

Es spielt keine Rolle, welcher Datensatz zurückgegeben wird.

Vielen Dank für jede Hilfe im Voraus!

+0

Wie werden Ihre Daten gespeichert sind, oder was haben Sie es in in C# – Edward

+0

Ivans geladen Antwort wird Sie dort ankommen. Es ist am besten, wenn Sie eine Art von alphabetischer Sortierung vor dem Laden Ihrer Daten von sagen, eine db-Tabelle zu einer Klasse zu "normalisieren", so dass Sie dann nach einem zusammengesetzten Schlüssel gruppieren können. – Edward

Antwort

3

Ein Weg, ich durch eine „normalisierte“ composite Schlüssel ist, um Gruppe denken kann, wo normalisierte Mittel zum Beispiel der erste Schlüssel ist die kleinere der beiden und die zweite ist die größer:

var result = input 
    .GroupBy(x => new 
    { 
     K1 = string.Compare(x.Team1, x.Team2) < 0 ? x.Team1 : x.Team2, 
     K2 = string.Compare(x.Team1, x.Team2) < 0 ? x.Team2 : x.Team1, 
    }) 
    .Select(g => g.First()) 
    .ToList(); 
1

könnten Sie eine benutzerdefinierte Comparer verwenden:

using System; 
using System.Collections.Generic; 
using System.Linq; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var fixtures = new List<Match> { 
      new Match { Team1 = "Eagles", Team1Score = 2, Team2 = "Hawks", Team2Score = 4}, 
      new Match { Team1 = "Hawks", Team1Score = 1, Team2 = "Eagles", Team2Score = 2 }, 
     }; 

     var results = fixtures 
      .GroupBy(x => x, new MatchComparer()) 
      .Select(x => new { x.Key.Team1, x.Key.Team2, Team1Total = x.Sum(s => s.Team1Score), Team2Total = x.Sum(s => s.Team2Score) }); 
    } 
} 

public class MatchComparer : IEqualityComparer<Match> 
{ 
    public bool Equals(Match x, Match y) 
    { 
     return (x.Team1 == y.Team1 && x.Team2 == y.Team2) || 
      (x.Team1 == y.Team2 && x.Team2 == y.Team1); 
    } 

    public int GetHashCode(Match obj) 
    { 
     return obj.Team1.GetHashCode() + obj.Team2.GetHashCode(); 
    } 
} 

public class Match 
{ 
    public string Team1 { get; set;} 
    public int Team1Score { get; set; } 
    public string Team2 { get; set; } 
    public int Team2Score { get; set; } 
} 
+0

Ich würde sagen, dass dies nicht gefragt ist, da es sich um eine benutzerdefinierte Methode und nicht um eine LINQ-Anweisung handelt. – Edward

Verwandte Themen