c# - 使用 C# LINQ 按任一列分组

标签 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 对于该官员..John 是官员 A 的 RO1 和官员 B 的 RO2,因此,当由约翰领导下的 RO 分组时,我希望官员 A 和 B 都被选中。对于 Carl 来说,官员 B 的 RO3 和官员 D 的 RO2 所以当由 Carl 领导下的 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 

任何帮助都会很棒

谢谢。

最佳答案

最简单的方法可能是"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

关于c# - 使用 C# LINQ 按任一列分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2153719/

相关文章:

c# - 如何在 silverlight 中将 Textbox.Width 设置为 100%?

c# - 如何将异步方法作为操作传递?

sql - Entity Framework (LINQ) 可以根据 JSON where 子句选择行吗?

c# - 如何显示带有客户端验证的验证摘要?

c# - 记住可扩展/可折叠导航区域的最后设置

c# - Windows 手机 7 : Other ways to remind the user of an event then alarm?

c# - 在 ASP.Net MVC 中创建异步报告

c# - 删除常规数组的元素

c# - 对 SQL 2005 中的程序集使用 WITH PERMISSION_SET = UNSAFE 不好吗?

c# - 搜索元组的 LINQ 查询