对列表进行排序并为每个项目提供新的排序索引

时间:2013-04-22 08:20:44

标签: c# asp.net-mvc sorting razor

假设我有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 ...

如何在没有硬编码或数据库更新命令的情况下执行此操作?

2 个答案:

答案 0 :(得分:3)

LukeHennerleys的回答可能是更高的标准,但我宁愿用简单的for-loop更改SortingMenu的值。如果已经对列表进行了排序,这应该可以解决问题。

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

答案 1 :(得分: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 });
}