Упорядочить по убыванию подэлементов с помощью LINQ или лямбда-выражения - PullRequest
1 голос
/ 28 апреля 2019

У меня была проблема с порядком подэлементов в List, и я нашел тему для обсуждения List против IEnumerable в foreach . Интересно, как упорядочить дочерний List с помощью LINQ или Lambda? Expression. Может ли кто-нибудь порекомендовать меня? Пример кода выглядит следующим образом:

public class Parent
{
    // Other properties...
    public IList<Child> Children { get; set; }
}

public IEnumerable<Parent> DoStuff()
{
    var result = DoOtherStuff() // Returns IEnumerable<Parent>
        .OrderByDescending(SomePredicate) 
        .ThenBy(AnotherPredicate); // This sorting works as expected in the return value.

    foreach (Parent parent in result)
    {
        parent.Children = parent.Children.OrderBy(YetAnotherPredicate).ToList();
        // When I look at parent.Children here in the debugger, it's sorted properly.
    }

    return result;
    // When I look at the return value, the Children are not sorted.
}

1 Ответ

1 голос
/ 28 апреля 2019

Вы перечисляете result каждый раз, когда перечисляете возврат IEnumerable из DoStuff, плюс одно дополнительное время внутри цикла в самом DoStuff. Изменения, которые вы делаете внутри цикла, не остаются, однако, из-за отложенного выполнения : при следующем перечислении DoStuff() будет другой вызов DoOtherStuff и т. Д.

Вы можете исправить это несколькими способами:

  • Преобразовать result в список перед сортировкой дочерних элементов, т.е.

    DoOtherStuff() // Returns IEnumerable<Parent>
    .OrderByDescending(SomePredicate) 
    .ThenBy(AnotherPredicate)
    .ToList();
    
  • Добавить дочернюю сортировку в Select:

    DoOtherStuff() // Returns IEnumerable<Parent>
    .Select(parent => {
        parent.Children = parent.Children.OrderBy(YetAnotherPredicate).ToList();
        return parent;
    })
    .OrderByDescending(SomePredicate) 
    .ThenBy(AnotherPredicate)
    .ToList();
    
  • Используйте yield return result в цикле (это вариант решения Select).

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