按多列分组,然后对结果排序

Group by multiple columns, then order results

我有一个包含多个属性的 class 列表,我想按其中的 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 的结果不是 return cls 列表,所以我什至不确定如何定义我想要订购的东西。我希望我已经提供了足够的信息来解释我正在尝试做的事情。提前谢谢你。

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

下面是一些示例数据的样子。我已经包含了 10 列示例数据,但是 class.

中有更多的 50 列

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

SMITH|JOHN|123 M|99523|Medicare|POL123|GRP123|GRPNM|SMITH| JOHN|123 MAIN ST 99253

SMITH|JOHN|123 M|99523|Medicare|POL123|GRP123|GRPNM|SMITH| JOHN|123 MAIN ST 99253

SMITH|JOHN|123 M|99523|Commercial|POL456|GRP456|GRRNM|SMITH| JOHN|123 MAIN ST 99253

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

SMITH|MARY|992 W|99324|Commerical|POLXXY|GRPXXY|GRPNM|SMITH|MARY|992 WEST ST 99324

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

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

SMITH|JOHN|123 M|99523|Medicare|POL123|GRP123|GRPNM|SMITH| JOHN|123 MAIN ST 99253

SMITH|JOHN|123 M|99523|Commercial|POL456|GRP456|GRRNM|SMITH| JOHN|123 MAIN ST 99253

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

SMITH |MARY|992 W|99324|Commerical|POLXXY|GRPXXY|GRPNM|SMITH|MARY|992 WEST ST 99324

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

我假设您不需要聚合

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