如何使用Linq对父子集合进行排序?

4

我有以下基础类(为了这个问题而简化):

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

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

如果我有一个父级集合,我想要做的是得到一个按Parent.Name排序的IList,而且每个父级的子项都需要按其名称排序。
我已经尝试了以下代码(只对父级进行了排序,没有对子项进行排序):
IList<Parent> parents = ... //Populated

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

我已经搜索了但找不到任何东西(可能是我太蠢了)。

对于Linq新手有什么建议吗?

提前感谢!

安迪

2个回答

4
首先,按照你的方式在列表上调用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();

0

同样的解决方案,使用LINQ方法语法:

IList<MyType> myTypeList = ... //Populated

var sortedList = myTypeList.Select(t =>
{
    t.Children = t.Children.OrderBy(c => c.Name).ToList();
    return t;
}).ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接