Группировать по любому столбцу, используя C # LINQ - PullRequest
4 голосов
/ 28 января 2010

У меня есть набор данных с такими столбцами, как ниже

OffName,RO1,RO2,RO3

Для более подробного объяснения я использую пример данных, как показано ниже:

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

RO расшифровывается как Reporting Officer. Каждый сотрудник сообщает до 3 RO. Мне необходимо составить отчет, в котором мне нужно показать группировку по RO независимо от того, является ли сотрудник RO1, RO2 или RO3 для сотрудника. Джон - RO1 для сотрудника A и RO2 для сотрудника B, поэтому, когда сгруппированы по RO под Джоном, я хочу, чтобы оба офицера A и B были выбраны. То же самое для Карла - RO3 для офицера B и RO2 для офицера D, поэтому, когда они сгруппированы по Ro под Карлом, оба офицера B & D выбираются ..

Так что для вышеупомянутых данных, когда сгруппированы по RO, я хочу, чтобы результат был как

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

Любая помощь будет отличной

Спасибо.

1 Ответ

1 голос
/ 29 января 2010

Самый простой способ - это "сгладить" проблему и затем сделать группу следующим образом:

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

Здесь я предполагаю, что officers - это IEnumerable<Officer>, где

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

С вашими примерами данных это мой вывод:

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