按多列分组,然后对结果排序
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();
我有一个包含多个属性的 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();