[英]Swapping two elements and its sub-elements in a xml file using linq to xml
[英]To Order By Descending sub-elements using LINQ or Lambda Expression
我在对 List 中的子元素进行排序时遇到了问题,并找到了在 foreach 中讨论List<T> 与 IEnumerable<T>的主题。我想知道如何使用 LINQ 或 Lambda 表达式对子 List 进行排序。 有人可以推荐我吗? 代码示例如下:
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.
}
每次枚举DoStuff
的返回IEnumerable
时都会枚举result
,再加上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
解决方案的变体)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.