C# 在C中管理人造树#

C# 在C中管理人造树#,c#,tree,C#,Tree,我的任务是在现有的代码库中添加一个特性。代码主要由刚离开我们团队的开发人员编写。考虑到这一点,我有一些限制:/ 开发人员以前编写过一些代码,看起来像是列表和树之间的交叉。在用户界面中,它是一个树形结构。然而,在代码中,它是一个列表。这有点奇怪。此处定义了两个主要类别: public class TreeBranch { public Guid ID { get; set; } } public class TreeItem { public Guid ID { get; set; }

我的任务是在现有的代码库中添加一个特性。代码主要由刚离开我们团队的开发人员编写。考虑到这一点,我有一些限制:/

开发人员以前编写过一些代码,看起来像是列表和树之间的交叉。在用户界面中,它是一个树形结构。然而,在代码中,它是一个列表。这有点奇怪。此处定义了两个主要类别:

public class TreeBranch
{
  public Guid ID { get; set; }
}

public class TreeItem
{
  public Guid ID { get; set; }
  public Guid TreeBranchID { get; set; }
  public Guid? ParentTreeItemID { get; set; }

  public int Level { get; set; }

  public DateTime CreatedOn { get; set; }
  public DateTime? MarkedOn { get; set; }
}
因此,TreeBranch存储在数据库表中,TreeItem存储在数据库表中。执行一个查询,返回具有特定TreeBranchID(其MarkedOn值为NULL)的所有TreeItem元素。这就是要处理的列表:

List<TreeItem> treeItems = GetTreeBranchItems("someID");
treeItems.Sory(new TreeItemComparer());
在上面的例子中,我应该只有以下几点:

public class TreeItemComparer: IComparer<TreeItem>
{
  // allow us to look up parent Items by GUID
  IDictionary<Guid, TreeItem> itemLookup;

  public TreeItemComparer(IEnumerable<TreeItem> list)
  {
    itemLookup = list.ToDictionary(item => item.ID);
    foreach (var item in list)
      SetLevel(item);
  }

  public int SetLevel(TreeItem item)
  {
    if ((item.Level == 0) && (item.ParentTreeItemID != Guid.Empty))
    {
      if (itemLookup.ContainsKey(item.ParentTreeItemID))
        item.Level = 1 + SetLevel(itemLookup[item.ParentTreeItemID]);
    }
    else if (item.ParentTreeItemID == Guid.Empty)
      item.Level = 1;

    return item.Level;
  }

  public int Compare(TreeItem x, TreeItem y)
  {
    // see if x is a child of y
    while (x.Level > y.Level)
    {
      if ((x.ParentTreeItemID == y.ID) || (x.ParentTreeItemID == Guid.Empty))
        return 1;
      x = itemLookup[x.ParentTreeItemID];
    }

    // see if y is a child of x
    while (y.Level > x.Level)
    {
      if ((y.ParentTreeItemID == x.ID) || (y.ParentTreeItemID == Guid.Empty))
        return -1;
    }

    // x and y are not parent-child, so find common ancestor
    while (x.ParentTreeItemID != y.ParentTreeItemID)
    {
      if (x.ParentTreeItemID != Guid.Empty)
        x = itemLookup[x.ParentTreeItemID];
      if (y.ParentTreeItemID != Guid.Empty)
        y = itemLookup[y.ParentTreeItemID];
    }

    // compare createDate of children of common ancestor
    return x.CreatedOn.CompareTo(y.CreatedOn);
  }
}
Item 1
  Item 1-A  (Imagine this TreeItem has a MarkedOn value that is NOT null)
    Item 1-A-a
      Item 1-A-a-1
    Item 1-A-b
  Item 1-B
Item 1
  Item 1-B
然而,我越来越

Item 1
  Item 1-A-a
    Item 1-A-a-1
  Item 1-A-b
  Item 1-B
我的问题是,具有MarkedOn值的TreeItem及其所有“子项”不应成为集合的一部分。因为我们的环境,我不能接触数据库:(。同时,我不知道如何在代码中这样做。有人有什么想法吗


谢谢!

您可以在从数据库中获取结果后对其进行筛选

List<TreeItem> orphanedItems = new List<TreeItem>();
foreach (TreeItem item in results)
{
    if (item.ParentTreeItemID != Guid.Empty &&
        !results.Any(tree => tree.ID == item.ParentTreeItemID)
    {
        orphanedItems.Add(item);
    }
}
foreach (TreeItem orphan in orphanedItems)
    results.Remove(orphan);
List孤儿编辑ems=new List();
foreach(结果中的TreeItem项)
{
如果(item.ParentTreeItemID!=Guid.Empty&&
!results.Any(tree=>tree.ID==item.ParentTreeItemID)
{
添加(项目);
}
}
foreach(孤儿编辑中的TreeItem孤儿)
结果:移除(孤儿);

我看不到任何依赖于MarkedOn的逻辑。既然你说特定的代码位是破坏性的,那么包含它会有帮助。请你解释一下行“!results.Contains(tree->tree.ID==item.ParentTreeItemID)”。我得到了一个编译时错误。我想你可能在尝试用lambda运算符代替“->”然而,我也遇到了一个编译时错误。@EelsFan:对于很多F#编程,我会修复它。