是否有可能(最好使用LINQ)在组内自行订购具有自然分组的集合而不会扰乱组顺序?
让我解释一下。我有一个集合:
List<grpitem> list = new List<grpitem>()
{
new grpitem() {groupCode="1", item="a"},
new grpitem() {groupCode="1", item="b"},
new grpitem() {groupCode="1", item="c"},
new grpitem() {groupCode="2", item="a"},
new grpitem() {groupCode="2", item="c"},
new grpitem() {groupCode="2", item="b"},
new grpitem() {groupCode="3", item="c"},
new grpitem() {groupCode="3", item="b"},
new grpitem() {groupCode="3", item="a"}
};
其到达的顺序(groupCode的顺序)在别处确定。我需要重新排列集合,以便在每个组中,元素按项目值排序,即:
{groupCode="1", item="a"},
{groupCode="1", item="b"},
{groupCode="1", item="c"},
{groupCode="2", item="a"},
{groupCode="2", item="b"},
{groupCode="2", item="c"},
{groupCode="3", item="a"},
{groupCode="3", item="b"},
{groupCode="3", item="c"},
该集合可以同样到达groupCode顺序“2”,“3”,“1”或其他任何内容。我不能打扰 - 我只需要重新排序每个组中的元素。
LINQ查询真的很整洁! (我可能昏暗但我还没找到一个)
我试过这个:
var reOrdered = (from x in list
group x by x.groupCode into groups
select groups)
.OrderBy(i => from j in i select j.item)
.SelectMany(i => i);
但是我收到一个错误 - “至少有一个对象必须是IComparable”,这让我很困惑。
最后,这必须是.Net3.5中的C#,不能迟到。
答案 0 :(得分:22)
var ordered = list.GroupBy(grp => grp.groupCode)
.SelectMany(g => g.OrderBy(grp => grp.item));
这是一个带有乱码样本数据的 demo 。