2012-09-15 39 views
3

我有父子关系,是这样的:如何使用linq对列表及其子女及其子女进行排序?

public class MyType { 

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

} 

我想在列表中选择,使每个级别是为了。

我可以为顶级做到这一点很容易:

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

但我怎么做,每一套儿童?

最终结果将是所有子项的列表或类型,并且子项(依此类推)均按顺序正确排序。

谢谢。

回答

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()); 
    } 
} 
2

如果您使用SortedList作为基础儿童收藏,则可以让孩子保持排序。然后,您可以公开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(); 
} 

与排序列表出发将然而容易得多。

0

thry这

mylist.Children.OrderBy(x => x.Order).ThenBy(x => x.order).ToList(); 
1

我与杰夫的最简单的答案是存储排序如果数据一致将成为您的主要访问模式。但是,假设你真的想使用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)传递给它自己,以递归方式将它自己应用到树中。

0

如果最终的结果只是有要孩子的列表(而不是父母与子女嵌套的列表),您可以使用SelectMany

IEnumerable<Child> result = parents 
    .SelectMany(p => p.Children) 
    .OrderBy(child => child.Order);