【问题标题】:Group by multiple columns, then order results按多列分组,然后对结果进行排序
【发布时间】:2019-08-10 04:16:58
【问题描述】:

我有一个包含多个属性的类列表,我想按其中的 5 个进行分组,然后按 5 个不同的属性对分组结果进行排序。结果应该是 List()。

让我们说(伪代码)....

public class cls()
    string firstSTR {get;set;}
    string secondSTR {get;set;}
    string thirdSTR {get;set;}
    string fourthSTR {get;set;}
    string fifthSTR {get;set;}
List<cls> vals = new List<cls>();
var tmp = PopulateList(); // Here I would populate several hundred cls()

var unique = tmp.GroupBy(i => new {
    i.firstSTR,
    i.secondSTR,
    i.thirdSTR,
    i.fourthSTR,
    i.fifthSTR
 }).ToList().OrderBy (i => new {
    i.firstSTR,
    i.secondSTR,
    i.thirdSTR,
    i.fourthSTR).ToList();

我对 Linq 的经验非常有限,我无法弄清楚为什么这不起作用。第一个 group by 的结果不返回 cls 列表,所以我什至不确定如何定义我想要订购的东西。我希望我已经提供了足够的信息来解释我想要做什么。提前谢谢你。

----- 编辑-------

以下是一些示例数据的样子。我已经包含了 10 列样本数据,但是类中有更多的 50 列。

Last5|First5|Add5|ZipCode|InsuranceName|Policy#|Group#|GroupName|SubscriberName|SubscriberAddress

史密斯|约翰|123 M|99523|医疗保险|POL123|GRP123|GRPNM|史密斯|约翰|123 MAIN ST 99253

史密斯|约翰|123 M|99523|医疗保险|POL123|GRP123|GRPNM|史密斯|约翰|123 MAIN ST 99253

SMITH|JOHN|123 M|99523|商业|POL456|GRP456|GRRNM|SMITH|约翰|123 MAIN ST 99253

SMITH|MARY|992 W|99324|Medicare|POL789|GRP789|GRPNM|SMITH|MARY|992 WEST ST 99324

SMITH|MARY|992 W|99324|商业|POLXXY|GRPXXY|GRPNM|SMITH|MARY|992 WEST ST 99324

上面有 5 条记录,用竖线分隔。前 5 个字段的输出数据必须是唯一的:Last5、First5、Add5、ZipCode 和 Insurance name。虽然我希望对前 5 列进行分组,但我需要将原始类对象中的所有数据填充到结果中。我的结果数据应该是这样的。

Last5|First5|Add5|ZipCode|InsuranceName|Policy#|Group#|GroupName|SubscriberName|SubscriberAddress

史密斯|约翰|123 M|99523|医疗保险|POL123|GRP123|GRPNM|史密斯|约翰|123 MAIN ST 99253

SMITH|JOHN|123 M|99523|商业|POL456|GRP456|GRRNM|SMITH|约翰|123 MAIN ST 99253

SMITH |MARY|992 W|99324|Medicare|POL789|GRP789|GRPNM|SMITH|MARY|992 WEST ST 99324

SMITH |MARY|992 W|99324|商业|POLXXY|GRPXXY|GRPNM|SMITH|MARY|992 WEST ST 99324

结果应该只有 4 条记录,因为 John Smith 的一个 Medicare 记录已被删除,因为前 5 个字段与另一个字段重复。其余 5 列中的任何其他字段(同样,我的数据中大约有 50 个)可以相同或不同,没关系。

【问题讨论】:

    标签: visual-studio linq c#-4.0


    【解决方案1】:

    我假设你不想要聚合

    var unique = tmp.GroupBy(i => new {
        i.firstSTR,
        i.secondSTR,
        i.thirdSTR,
        i.fourthSTR,
        i.fifthSTR
     }).Select(p=> new  {
       firstSTR = p.Key.firstSTR,
       secondSTR = p.Key.secondSTR,
       thirdSTR = p.Key.thirdSTR,
       fourthSTR=  p.Key.fourthSTR,
       fifthSTR =p.Key.fifthSTR,
    
    }).OrderBy(p=> p.firstSTR)
     .ThenBy(p=> p.secondSTR)
     .ThenBy(p=> p.thirdSTR)
     .ThenBy(p=> p.fourthSTR)
     .ThenBy(p=> p.fifthSTR)
     .ToList();
    

    【讨论】:

    • 在我的代码中查看这个结果,我认为我得到了正确分组和排序的唯一性,但它只给我填充了这 5 个属性,实际类大约有 50 个属性(列,如果你愿意) 宽。
    • 我想我正在尝试复制类似“SELECT * FROM TABLE GROUP BY firstSTR,secondSTR,thirdSTR,fourthSTR,fifthString ORDRE BY firstSTR,secondSTR,thirdSTR,fourthSTR) 之类的内容 - 请注意我不是在订购由第五个STR
    • 嘿@Keht,分组总是遵循聚合。我的意思是你不能只从表中选择所有你只能包含在 group by 子句中定义的列,其他列需要聚合才能被包含,即你必须使用 count、max、first 等函数
    • 您能否在查询前后以表格格式显示一些示例数据(关于您的需要)
    • 感谢瓦米克!我无法弄清楚如何使用stackoverflow中的选项卡使数据看起来正确,所以我用一个用管道分隔的数据示例更新了我的问题。希望这更清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多