Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use LINQ to order within groups

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.

like image 735
haughtonomous Avatar asked Sep 20 '13 12:09

haughtonomous


People also ask

How do I sort by group in C#?

GroupBy(student => student.Name) . Select(group => new { Name = group. Key, Students = group. OrderByDescending(x => x.

Does LINQ GroupBy preserve order?

Found answer on MSDN: Yes.

How does GroupBy work in LINQ?

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.

How do you order alphabetically in LINQ?

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.


1 Answers

var ordered = list.GroupBy(grp => grp.groupCode)
   .SelectMany(g => g.OrderBy(grp => grp.item));

Here's a demo with garbled sample data.

like image 79
Tim Schmelter Avatar answered Oct 13 '22 19:10

Tim Schmelter