嵌套父子列表,其中order by不起作用

时间:2012-10-09 13:12:19

标签: c# linq

我有以下代码:

public class Navigation
{
    public Navigation()
    {
        SubNavigation = new List<Navigation>();
    }

    public int Order { get; set; }
    public string Text { get; set; }
    public string RouteName { get; set; }
    public IList<Navigation> SubNavigation { get; set; }
}

然后我有:

IList<Navigation> list = new List<Navigation>(); 

我用一些数据填充列表。并非所有项目都有子导航。目前导航只有一个深度。

现在我想按顺序对每个项目的导航和子导航进行排序。我已经尝试了各种方法,但无论我尝试什么,我都无法在不重新创建对象的情况下对子导航进行排序。以下代码有效:

IList<Navigation> result = list.OrderBy(l => l.Order)
                               .Select(n => new Navigation
                               {
                                   Order = n.Order,
                                   Text = n.Text,
                                   RouteName = n.RouteName,
                                   SubNavigation = n.SubNavigation.OrderBy(s => s.Order).ToList()
                               }).ToList();

我不喜欢这种方法,我的问题是,如果使用LINQ和方法语法有更清晰/更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以在对象上添加新属性:

public IList<Navigation> OrderedSubNavigation 
{ 
    get
    {
        return SubNavigation.OrderBy(s => s.Order).ToList();
    }

}

然后当你想要订购时,你就可以使用它。

答案 1 :(得分:0)

  

我尝试了各种方法,但无论我尝试什么,我都无法在不重新创建对象的情况下对子导航进行排序。

嗯不,你不能干净利落 - 因为让子导航按特定顺序进行操作需要修改现有对象,而LINQ不是为此而构建的。 LINQ是为查询而构建的,它不应该改变它们所处理的数据。

一种选择是只在你需要的时候对子导航进行排序 - 在Navigation内进行无序处理,然后当你真正需要子导航项时(例如为了显示)你可以在那一点订购。除此之外,如果您最终不显示子导航项目,这将使其更有效。