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

时间:2009-09-10 23:50:18

标签: c# .net linq

我有以下基本课程(减少这个问题):

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

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

如果我有一个Parent集合,我想要做的是获取一个按Parent.Name排序的IList,并且每个父节点的Children需要按其Name排序。

我试过这个(只对父母而不是孩子进行分类):

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

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

我搜索过但找不到任何东西(可能是我傻了)。

对Linq新手的任何建议?

提前致谢

安迪

1 个答案:

答案 0 :(得分: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();