我目前正在开发一个 IComparer,它可以很好地处理简单的 int 和 string 属性,升序和降序也可以正常工作,但我遇到了分层数据结构的问题。
假设您的数据库中有下表:
HierarchyTable
ID, int
Name, string
SortOrder, int
ParentID, int
HierarchyTable 在 ID 和 ParentID 之间建立了一个自引用关系,从而构建了我们的层次结构。
现在问题从我的 SortOrder 开始。 SortOrder 不是代表整个级别排序顺序的唯一整数,而是它仅存储您所在的当前级别的排序顺序。
让我们假设以下数据:
ID --- Name --- SortOrder --- ParentID
1 --- A --- 0 --- null
2 --- B --- 1 --- 4
3 --- C --- 2 --- 1
4 --- D --- 1 --- 1
5 --- E --- 1 --- 3
这将导致以下层次结构:
ID --- Name --- SortOrder --- ParentID
1 --- A --- 0 --- null
4 --- D --- 1 --- 1
2 --- B --- 1 --- 4
3 --- C --- 2 --- 1
5 --- E --- 1 --- 3
现在我希望在一个 IComparer 和一个只调用 Sort 方法的列表的帮助下,将这个层次结构放在一个平面列表中,瞧,这是一个正确排序的平面列表。
这个表结构在我的Entity Framework 应用程序中并且代表一个实体,所以如果我需要我可以用其他属性扩展它。
这个简单示例的实体看起来像这样:
public class HierarchyTable
{
public int ID { get; set; }
public string Name { get; set; }
public int SortOrder { get; set; }
public in ParentID { get; set; }
//Navigation Properties created by Entity Framework
public virtual HierarchyTable Parent { get; set; }
public virtual ICollection<HierarchyTable> Children { get; set; }
}
最佳答案
您的比较器需要 SortOrders 的列表,遵循每条记录(父、子、孙...)的整个祖先链。像这样:
ID --- Name --- SortOrder --- ParentID --- HierarchicalSortOrder
1 --- A --- 0 --- null --- 0
2 --- B --- 1 --- 4 --- 0,1,1
3 --- C --- 2 --- 1 --- 0,2
4 --- D --- 1 --- 1 --- 0,1
5 --- E --- 1 --- 3 --- 0,2,1
然后您可以简单地按 HierarchicalSortOrder 进行排序:
1 --- 0
4 --- 0,1
2 --- 0,1,1
3 --- 0,2
5 --- 0,2,1
以下函数构造此 HierarchicalSortOrder:
public string GetHierarchicalSortOrder(HierarchyTable element)
{
List<int> sortOrders = new List<int>() {element.SortOrder};
while (element.Parent != null)
{
element = element.Parent;
sortOrders.Insert(0, element);
}
return String.Join(",", sortOrders);
}
为简单起见,我假设排序顺序中没有关系;如果有,您还应该在列表中包含 element.ID,否则 child 会依附于错误的 parent 。
关于c# - IComparer 逻辑将层次结构排序为平面列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20545137/