Reputation: 4857
Let's say I have a list of groups. Each group has a list of persons. How can I sort the groups by their youngest person?
var groups = new List<Group>{groupA, groupB, groupC};
public class Group {
public string Name {get; set;}
public List<Person> Members {get; set;}
}
public class Person {
public string Name {get; set;}
public double Age {get; set;}
}
Upvotes: 0
Views: 1043
Reputation: 23218
You can use OrderBy
method with Min
age of Members
list of each group
var groups = new List<Group>
{
new Group {Name = "group1", Members = new List<Person> {new Person {Age = 5}, new Person {Age = 2}}},
new Group {Name = "group2", Members = new List<Person> {new Person {Age = 3}, new Person {Age = 4}}},
new Group {Name = "group3", Members = new List<Person> {new Person {Age = 1}}}
};
var result = groups.OrderBy(g => g.Members.Min(m => m.Age));
It gives you the group3 (minimal Age
is 1), group1 (minimal Age
is 2), group2 (minimal Age
is 3) order in example above
Upvotes: 4
Reputation: 726479
OrderBy
lets you use any expression you wish, no matter how complex, so you could write
var byYongestMember = groups
.OrderBy(g => g.Select(p => p.Age).Min());
However, this may be somewhat slow when there's a lot of people in each group, and the groups themselves are large, so you would be better off pairing up each group with the age of its youngest member, sorting the pairs, and then projecting the groups:
var byYongestMember = groups
.Select(g => new {
Group = g
, MinAge = g.Members.Min(p => p.Age)
})
.OrderBy(p => p.MinAge)
.Select(p => p.Group);
This way, figuring out the youngest member's age would happen only once per group.
Upvotes: 0