有时你会得到其中的一天,无论你多少把头撞到墙上,即使是最简单的任务也会暗示你(这是其中的一天!)。
所以我拥有的是类别列表
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);
}
}
}
现在我遇到了两个问题
自引用并不太令人担忧(它被设计为递归)但由于foreach
循环中的类别是本地实例化的变量,我无法通过引用将其作为参考并将其用作一个指针。
我确信必须有一个比这更简单的方法!
任何指针都会受到极大的欢迎。
答案 0 :(得分: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);
}
答案 1 :(得分: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”来实际替换引用。您必须删除子引用并添加一个新引用。