Как вы сортируете родительскую и дочернюю коллекции с помощью Linq?

У меня есть следующие основные классы (сокращенные для этого вопроса):

public class Parent
{
    public string Name { get; set; }
    public IList<Child> Children { get; set; }
}

public class Child
{
    public string Name { get; set; }
}

Если у меня есть родительская коллекция, я хотел бы получить IList, отсортированный по Parent.Name, а также дочерние элементы для каждого родителя, которые должны быть отсортированы по их имени.

Я пробовал это (который сортирует только родителей, а не детей):

IList<Parent> parents = ... //Populated

parents.OrderBy(p => p.Name).ThenBy(p => p.Children.OrderBy(c => c.Name)).ToList()

Я искал, но ничего не нашел (наверное я тупой).

Какие-нибудь предложения для новичка в Linq?

заранее спасибо

Энди


person andypike    schedule 10.09.2009    source источник


Ответы (1)


Прежде всего, вызов OrderBy в списке, как вы это делаете, не будет сортировать его на месте. Он вернет новый отсортированный IEnumerable; вы можете использовать .ToList(), чтобы превратить его в список, но это все равно будет копией. Теперь о самой сортировке. Вам действительно нужно не просто упорядочить элементы в коллекции, но и сделать копию каждого элемента, который также будет отсортирован по Children. Так:

IList<Parent> parents = ... //Populated

parents = (from p in parents
           orderby p.Name
           select new Parent
           {
               Name = p.Name,
               Children = p.Children.OrderBy(c => c.Name).ToList()
           }
          ).ToList();
person Pavel Minaev    schedule 10.09.2009