我有以下代码:
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和方法语法有更清晰/更好的方法吗?
答案 0 :(得分:1)
您可以在对象上添加新属性:
public IList<Navigation> OrderedSubNavigation
{
get
{
return SubNavigation.OrderBy(s => s.Order).ToList();
}
}
然后当你想要订购时,你就可以使用它。
答案 1 :(得分:0)
我尝试了各种方法,但无论我尝试什么,我都无法在不重新创建对象的情况下对子导航进行排序。
嗯不,你不能干净利落 - 因为让子导航按特定顺序进行操作需要修改现有对象,而LINQ不是为此而构建的。 LINQ是为查询而构建的,它不应该改变它们所处理的数据。
一种选择是只在你需要的时候对子导航进行排序 - 在Navigation
内进行无序处理,然后当你真正需要子导航项时(例如为了显示)你可以在那一点订购。除此之外,如果您最终不显示子导航项目,这将使其更有效。