1

有时,无论您如何将头撞到墙上,您都会遇到这样的日子,即使是最简单的任务也会暗示您(这是那些日子之一!)。

所以我有一个类别列表

CategoryID, CategoryName, ParentID, Lineage
1           Root Category,  NULL,   /1/
2           Child Category, 1,      /1/2/
3           Grandchild,     2,      /1/2/3 
4           Second Root,    NULL,   /4/
5           Second Child    2,      /1/2/5/

我创建了一个类来保存它,它包含上述所有值,加上

ICollection<Category> Children;      

这应该创建树

Root Category 
`-- Child category
|   `-- Grandchild
`-- Second Child
Second Root

因此,我尝试在给定 Lineage 和元素的情况下向树中添加一个新类别,我将 lineage 转换为队列并将其放入此函数中。

public void AddToTree(ref Category parentCategory, Category newCategory, Queue<Guid>lineage)
    {

        Guid lastNode = lineage.Dequeue();

        if(lastNode == newCategory.CategoryId)
        {
            parentCategory.Children.Add(newCategory);
            return;
        }

        foreach (var category in parentCategory.Children)
        {
            if(category.CategoryId == lastNode)
            {
                this.AddToTree(ref category, newCategory, lineage);
            }
        }
    }

现在我遇到了两个问题

  1. 自引用并不太令人担忧(它被设计为递归),但由于foreach循环中的类别是一个本地实例化的变量,我不能通过引用来制作它并将其用作指针。

  2. 我相信一定有比这更简单的方法!

任何指针都会受到极大的欢迎。

4

2 回答 2

1

这段代码似乎是您正在寻找的,但没有任何自我引用和递归 - 它沿着给定的沿袭穿过树,并在沿袭的末尾插入给定的类别。几个假设:

  • 树存储为其根的列表
  • 血统是一个字符串

    void AddCategory(List<Category> roots, Category categoryToAdd, string lineage)
    {
        List<Guid> categoryIdList = lineage.Split('/').Select(id => new Guid(id)).ToList();
    
        List<Category> currentNodes = roots;
        Category parentNode = null;
    
        foreach (Guid categoryId in categoryIdList)
        {
            parentNode = currentNodes.Where(category => category.CategoryId == categoryId).Single();
            currentNodes = parentNode.Children;
        }
    
        parentNode.Children.Add(categoryToAdd);
    }
    
于 2012-08-01T12:30:16.950 回答
0

您似乎根本不需要“参考”。您没有修改对象引用,只是修改它的状态。

编辑:如果您必须使用 ref,则使用临时变量,例如...

        foreach (var temp in parentCategory.Children)
        {
            Category category = temp;
            if (category.CategoryId == lastNode)
            {
                this.AddToTree(ref category, newCategory, lineage);
            }
        }

但即使这样,参考也没什么用。AddToTree 不会修改参考值。它修改引用对象的状态。也许您有更多我们需要查看的代码。

如果您的意图是修改父项中的子引用,那么您将遇到 ICollection Children 对象的问题。您不能在 ICollection 中的元素上使用“ref”来实际替换引用。您必须删除子引用并添加一个新引用。

于 2012-08-01T12:15:29.007 回答