is it possible (using LINQ preferably) to order a collection which has a natural grouping, within the groups themselves without upsetting the group order?
Let me explain. I have a collection thus:
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"}
};
The order in which this arrives (order of groupCode) is determined elsewhere. I need to rearrange the collection so that within each group, elements are ordered by the item value, viz:
{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"},
The collection could just as equally arrived in the groupCode order "2", "3", "1", or whatever. I must not disturb that - I just need to reorder the elements within each group.
A LINQ query would be really neat! (I'm probably being dim but I haven't yet found one)
I've tried this:
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);
but I get an error - "at least one object must IComparable", which puzzles me.
Lastly, this must be C# in .Net3.5, no later.
GroupBy(student => student.Name) . Select(group => new { Name = group. Key, Students = group. OrderByDescending(x => x.
Found answer on MSDN: Yes.
Group by works by taking whatever you are grouping and putting it into a collection of items that match the key you specify in your group by clause.
SelectedValue) . OrderBy(s=> s.Name). ToList(); The order by does nothing, just executes the query, the ToList will do the sort for the original query.
var ordered = list.GroupBy(grp => grp.groupCode)
.SelectMany(g => g.OrderBy(grp => grp.item));
Here's a demo with garbled sample data.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With