Group By使用C#LINQ的任一列

时间:2010-01-28 10:18:09

标签: c# .net linq linq-to-objects group-by

我有一组数据,其中包含以下

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代表报告官。每个官员向最多3个RO报告。我需要报告我需要显示RO的分组,无论该人员是RO1还是RO2或RO3。约翰是A级的RO1和B级的RO2,所以当按照约翰逊的RO分组时,我想要A和A的官员。 B被选中。卡尔的名单是B官员的RO3和D官员的RO2,所以当他们在卡尔的职责范围内分别由B和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 个答案:

答案 0 :(得分:1)

最简单的方法可能是"flatten"问题,然后通过以下方式进行分组:

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

在此,我假设officersIEnumerable<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