我将数据集拉入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>
集合完成?
答案 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)。
注意:我假设DB的顺序是父顺序,而父顺序是Id,而不是孩子。
答案 2 :(得分: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;
}
}