4

我有亲子关系,例如:

public class MyType {

    public IList<MyType> Children {get;set;}
    public int Order {get;set;}

}

我想选择列表,以便每个级别都按顺序排列。

我可以轻松地为顶层做到这一点:

mylist.Children.OrderBy(x => x.Order)

但是我该如何为每组孩子做呢?

最终结果将是列表或类型及其所有子项,并且所有子项(等等)都按 Order 正确排序。

谢谢。

4

5 回答 5

6

您可以通过添加一种方法来执行递归顺序,MyType如下所示:

public class MyType
{
    public IList<MyType> Childrens { get; set; }
    public int Order { get; set; }

    public void RecursiveOrder()
    {
        Childrens = Childrens.OrderBy(x => x.Order)
            .ToList();

        Childrens.ToList().ForEach(c => c.RecursiveOrder());
    }
} 
于 2012-09-15T08:38:06.067 回答
2

如果您使用 aSortedList作为基础子集合,则可以保持子排序。然后您可以公开该Values属性以获取值。order当您添加到列表时,只需按项目键入项目即可。

例如,

public class MyType
{
    public MyType(int order)
    {
        this.order = order;
    }

    private int order;
    private SortedList<int, MyType> children = new SortedList<int, MyType>();

    public int Order { get { return order; } }
    public IList<MyType> Children { get { return children.Values; } }

    public void AddChild(MyType child)
    {
        children.Add(child.order, child);
    }
}

否则,您可能希望对列表进行递归排序。在这里使用 LINQ 是不合适的。充其量,LINQ 将允许您按排序顺序遍历子级,但它实际上不会对基础列表进行排序,除非您将列表实例替换为排序版本。如果底层列表有一个Sort()方法(泛型List<T>有),那么使用它。

private List<MyType> children;
public void EnsureSorted()
{
    children.Sort();
    foreach (var child in children)
        child.EnsureSorted();
}

但是,从排序列表开始会容易得多。

于 2012-09-15T07:54:49.487 回答
1

我同意 Jeff 的观点,最简单的答案是存储已排序的数据(如果这将成为您的主要访问模式)。但是假设你真的想用 Linq 做到这一点:

首先,如果你知道你只想要两个级别的排序,你可以这样做:

myList.Children.OrderBy(x => x.Order)
    .Select(c => c.Children.OrderBy(x => x.Order))

但是,如果您真正想要的是完全递归排序,一路向下怎么办?

delegate IEnumerable<MyType> RecursiveFunc(MyType data, RecursiveFunc self);
RecursiveFunc op = (data, func) => data.Children.OrderBy(x => x.Order)
    .Select(x => func(x, func));

IEnumerable<MyType> result = op(myList, op);

只是写让我的大脑受伤,我还没有尝试运行它,所以祝你好运!它归结为将 linq 表达式(lambda)传递给自身,以递归地将自身应用到树中。

于 2012-09-15T15:49:58.937 回答
0

试试这个

mylist.Children.OrderBy(x => x.Order).ThenBy( x => x.order).ToList();
于 2012-09-15T08:11:29.753 回答
0

如果最终结果只是一个子列表(而不是具有嵌套子的父列表),您可以使用SelectMany

IEnumerable<Child> result  = parents
    .SelectMany(p => p.Children)
    .OrderBy(child => child.Order);
于 2012-09-15T16:02:08.473 回答