如何对数据为分层树(菜单)的C#数据列表进行排序?

时间:2009-05-21 19:22:11

标签: c# sorting

我将数据集拉入c#列表并对其进行排序。这是一个分级菜单:

示例对象:

public class NavigationInfo
{
    public Int32 Id { get; set; }
    public Int32 ParentId { get; set; } 
    public String Text { get; set; }
    public String Url { get; set; }
    public Int32 Sort { get; set; }
}

ParentId是Id的递归,Sort是ParentId中的升序整数。如何使用NavigationInfo中的List<NavigationInfo>集合完成?

3 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

var navigationInfos = new List<NavigationInfo>(); //fill this collection

navigationInfos.sort((a,b) => a.Id.CompareTo(b.Id)); //sort by Id
navigationInfos.sort((a,b) => a.ParentId.CompareTo(b.ParentId)); //sort by ParentId

UPDATE:您还可以使用LINQ并在列表上执行OrderBy。这会返回一个新的集合,但通过多个标准(升序或降序)更容易订购。

var navigationInfos = new List<NavigationInfo>(); //fill this collection
var listSortedById = navigationInfos
                             .OrderBy(n => n.Id).ToList();

var listSortedByParentId = navigationInfos
                               .OrderBy(n => n.ParentId).ToList();

var listSortedByIdThenByParentId = navigationInfos
                              .OrderBy(n => n.Id)
                              .ThenBy(p => p.ParentId)
                              .ToList();

var orderedByIdDescending = navigationInfos
                                      .OrderByDescending(n => n.Id)
                                      .ToList();

答案 1 :(得分:1)

如果您的层次结构不仅仅是一个简单的两级安排,那么您需要编写一个方法(可能是递归的),该方法可以向上移动树,收集每个项目ID的整个“路径”。一旦有了这条路径,分类步骤就相当容易了。

向NavigateInfo添加属性

public string ItemPath { get; set; }

然后使用这样的方法来设置该属性。

public string GetPath(List<NavigationInfo> list, int itemId)
{
    NavigationInfo item = list.SingleOrDefault(x => x.Id == itemId);
    if (item == null)
    {
        return "";
    }
    else
    {
        return GetPath(list, item.ParentId) + "\\" + itemId;
    }
}

答案 2 :(得分:1)

如果数据来自数据库,您可以让数据库以排序的方式发送输出(父项首先,后跟子项ID)。

注意:我假设DB的顺序是父顺序,而父顺序是Id,而不是孩子。