c# - IComparer 逻辑将层次结构排序为平面列表

标签 c# entity-framework sorting icomparer

我目前正在开发一个 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/

相关文章:

c# - 我读过 std::list 很糟糕。有人可以将它与 .Net 的 List<> 类型进行比较吗?我要从 C# 转到 C++

c# - 在 AutoCAD .Net 插件中执行多线程作业

c# - 实体类型 Employee 不是当前上下文模型的一部分

c# - 通过 DbContext 添加对象会重复相关对象

c# - 使用 Entity Framework 插入引用其他表中的记录的记录

python - "What does this mean: key=lambda x: x[-1] ?"

c# - 有没有更简单的方法在 c# 按钮、复选框、标签中做一个变量列表

c# - 如何使 NameValueCollection 可序列化?

javascript - 数据表日期排序(DD.MM.YYYY.)格式

java - 添加到单链表时自动按字段对对象进行排序?