2013-04-22 72 views
3

可以說我有3個菜單項。每個人內部都有(例如)5個鏈接。所以我有一個是這樣的:排序列表並給每個項目一個新的排序索引

//This is just some test-code. normally i''ll get the data from a database 
List<NavigationModel> navigation = new List<NavigationModel>(); 
Random randomInt = new Random(); 

for (int i = 0; i < 5; i++) 
{ 

    NavigationModel m = new NavigationModel(); 
    m.MenuName = "Users"; 
    m.LinkName = "Link (" + i + ")"; 
    m.ControllerName = "AAA"; 
    m.ActionName = "Function" + i; 
    m.SortingMenu = 5; 

    navigation.Add(m); 
} 

for (int i = 0; i < 5; i++) 
{ 
    NavigationModel m = new NavigationModel(); 
    m.MenuName = "Help"; 
    m.LinkName = "Link (" + i + ")"; 
    m.ControllerName = "BBB"; 
    m.ActionName = "Function" + i; 
    m.SortingMenu = 10; 

    navigation.Add(m); 
} 

for (int i = 0; i < 5; i++) 
{ 
    NavigationModel m = new NavigationModel(); 
    m.MenuName = "Home"; 
    m.LinkName = "Link (" + i + ")"; 
    m.ControllerName = "CCC"; 
    m.ActionName = "Function" + i; 
    m.SortingMenu = 2; 

    navigation.Add(m); 
} 

navigation = navigation.OrderBy(x => x.SortingMenu).ToList(); 

正如你可以看到我會得到3個菜單項與正確的排序,但我需要排序由0,緊接着1,2開始...

我怎樣才能做到這一點沒有硬編碼或數據庫更新命令?

+0

假設排序是穩定的,你需要通過2先進行排序,然後按1,然後由0(如果我正確地理解你的問題) – Nolonar 2013-04-22 08:25:05

+0

我仍然不能確定你想要達到的目的。然而,你不需要3個循環,你可以通過使用一個循環來重構這個循環,並且在裏面聲明多個'NavigationModel'對象。 – 2013-04-22 08:26:29

+0

@Nolonar我的3個項目得到了這個排序值:(5,10,2)。在lambda排序後,我會得到(2,5,10)。無論如何,我想這個排序改變爲這個值:(0,1,2) – Werner 2013-04-22 08:30:04

回答

3

LukeHennerleys答案可能是較高的標準,但我寧願用一個簡單的for-loop改變SortingMenu的價值。如果你已經對列表進行了排序,這應該可以做到。

for (int i = 0; i < navigation.Count; i++) 
{ 
    navigation[i].SortingMenu = i; 
} 
2

使用Select在撥打OrderBy後顯示索引。 Select((x, i))其中i將成爲您的索引。

public class TestObject 
{ 
    public string A { get; set; } 
    public int Index { get; set; } 
} 
public void Example() 
{ 
    List<TestObject> testObjects = new List<TestObject>(); 
    testObjects.Add(new TestObject() { A = "B" }); 
    testObjects.Add(new TestObject() { A = "C" }); 
    testObjects.Add(new TestObject() { A = "A" }); 
    var objects = testObjects.OrderBy(x => x.A).Select((x, i) => new TestObject() { A = x.A, Index = i }); 
}