2012-10-09 23 views
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和方法的語法的任何清潔劑/更好的辦法?

回答

0

我已經嘗試了各種方法,但無論我嘗試了什麼,我都無法在不重新創建對象的情況下獲取子導航進行排序。

哦,不,你不會能夠乾淨利落 - 因爲越來越子導航是在一個特定的順序要求修改現有的對象,而LINQ不是專爲這一點。 LINQ爲構建的查詢,它不應該改變它們工作的數據。

一種選擇是,只有當你需要排序的子導航 - 住在一起的事實,這是一個Navigation內無序,然後當你真正需要子導航項目(例如,用於顯示),你可以在這個順序點。除此之外,如果最終不顯示子導航項目,這將使其效率更高。當你想訂購的一個你只使用

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

} 

然後:

1

你可以在對象上添加新的屬性。

+0

謝謝克里斯。我想我會朝着這個方向前進。 – Thomas

+0

當然,如果你總是希望它只是有一個私人支持字段,而不是自動實現的get/set,並且有一個普通的setter和這個getter。 – Chris