【问题标题】:Group By either column using C# LINQ使用 C# LINQ 按任一列分组
【发布时间】:2011-01-10 08:32:55
【问题描述】:

我有一组包含如下列的数据

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 也是如此,所以当 RO 分组在 Carl 下时,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 

任何帮助都会很棒

谢谢。

【问题讨论】:

  • 您要分组还是排序?您谈论分组,但您想要的结果表明没有分组,而是排序。
  • 您在结果中有两次John B,可能是一个错误。那是linq到sql吗? linq 到对象?
  • 嗨,马克和科比,感谢您的回复。我已经用更多细节修改了上面的问题,并纠正了 d 错误。希望我的问题现在很清楚。非常感谢

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


【解决方案1】:

最简单的方法大概是"flatten"这个问题然后做group by:

    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

【讨论】:

  • 嗨,杰森,感谢您的解决方案,并为迟到的回复道歉。在不使用 lambda 表达式的情况下如何做到以上几点?任何建议都会很棒。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
相关资源
最近更新 更多