Как отсортировать список объектов по свойству вложенного списка с помощью Linq? - PullRequest
0 голосов
/ 18 марта 2020

Допустим, у меня есть список групп. У каждой группы есть список людей. Как я могу отсортировать группы по их младшему человеку?

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;}
}

Ответы [ 2 ]

3 голосов
/ 18 марта 2020

Вы можете использовать OrderBy метод с Min возраст Members список каждой группы

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));

Это дает вам group3 (минимальный Age равен 1), group1 (минимальный Age равен 2), group2 (минимальный Age равен 3) порядок в примере выше

0 голосов
/ 18 марта 2020

OrderBy позволяет вам использовать любое выражение, которое вы будете sh, независимо от того, насколько оно сложное, поэтому вы можете написать

var byYongestMember = groups
    .OrderBy(g => g.Select(p => p.Age).Min());

Однако, это может быть несколько медленным, когда в каждом из них много людей группа, а сами группы большие, поэтому вам лучше объединить каждую группу с возрастом ее младшего члена, отсортировать пары и затем спроецировать группы:

var byYongestMember = groups
    .Select(g => new {
        Group = g
    ,   MinAge = g.Members.Min(p => p.Age)
    })
    .OrderBy(p => p.MinAge)
    .Select(p => p.Group);

Таким образом, вычисляя возраст самого младшего члена будет происходить только один раз на группу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...