0

我有以下代码:

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 和方法语法是否有任何更清洁/更好的方法?

4

2 回答 2

1

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

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

}

然后,当您想要订购的时,您只需使用它。

于 2012-10-09T13:30:59.500 回答
0

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

好吧,不,你不能干净地 - 因为让子导航按特定顺序需要修改现有对象,而 LINQ 不是为此而构建的。LINQ 是为查询而构建的,它不应该改变他们处理的数据。

一种选择是仅在需要时对子导航进行排序 - 忍受它在 a 中无序的事实,Navigation然后当您真正需要子导航项(例如用于显示)时,您可以在该点订购。除此之外,如果您最终不显示子导航项,这将提高效率。

于 2012-10-09T13:17:45.113 回答