4 votes

Grouper par l'une ou l'autre colonne en utilisant C# LINQ

Je dispose d'un ensemble de données dont les colonnes sont les suivantes

OffName,RO1,RO2,RO3

Pour expliquer plus en détail, j'utilise un exemple de données comme ci-dessous :

OffName RO1    RO2   RO3 
A       John   Jack  Rob 
B       Earl   John  Carl 
C       Rob    Chris Kenny 
D       Rodney Carl  Jacob 

RO est l'abréviation de "Reporting Officer". J'ai besoin de faire un rapport dans lequel je dois montrer un regroupement par RO indépendamment de la personne qui est RO1 ou RO2 ou RO3 pour l'officier. John est RO1 pour l'officier A et RO2 pour l'officier B, donc quand il est regroupé par RO sous John, je veux que les deux officiers A et B soient sélectionnés.même pour Carl est RO3 pour l'officier B et RO2 pour l'officier D donc quand il est regroupé par Ro sous Carl les deux officiers B et D doivent être sélectionnés.

Ainsi, pour les données ci-dessus, regroupées par OR, je souhaite que le résultat soit le suivant

RO    OffName 
John     A 
         B 
Jack     A 
Rob      A 
         C 
Earl     B 
Carl     B 
         D 
Chris    C 
Kenny    C 
Rodney   D 
Jacob    D 

Toute aide serait la bienvenue

Merci.

1voto

Jason Points 125291

La méthode la plus simple consiste probablement à "aplatir" le problème, puis faire le groupe par :

    var query = officers.SelectMany(
        x => new[] {
            new { x.Name, RO = x.ReportingOfficer1 },
            new { x.Name, RO = x.ReportingOfficer2 },
            new { x.Name, RO = x.ReportingOfficer3 }
        }
    );
    var grouped = query.GroupBy(y => y.RO);
    foreach (var group in grouped) {
        foreach (var item in group) {
            Console.WriteLine(String.Format("{0}: {1}", item.RO, item.Name));
        }
    }

Ici, je suppose que officers est un IEnumerable<Officer>

class Officer {
    public string Name { get; set; }
    public string ReportingOfficer1 { get; set; }
    public string ReportingOfficer2 { get; set; }
    public string ReportingOfficer3 { get; set; }
}

Voici ce que j'ai obtenu à partir de votre échantillon de données :

John: A
John: B
Jack: A
Rob: A
Rob: C
Earl: B
Carl: B
Carl: D
Chris: C
Kenny: C
Rodney: D
Jacob: D

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X