C# 递归搜索范畴及其子类
我有以下课程:C# 递归搜索范畴及其子类,c#,recursion,C#,Recursion,我有以下课程: public class Category { public string Name { get; set; } public Category Parent { get; set; } public string Url { get; set; } public List<Category> Children { get; set; } } 我知道递归是一种方法,我已经设法想出了一个解决方案。不过我肯定看到它做得更好,但我找不到地方
public class Category {
public string Name { get; set; }
public Category Parent { get; set; }
public string Url { get; set; }
public List<Category> Children { get; set; }
}
我知道递归是一种方法,我已经设法想出了一个解决方案。不过我肯定看到它做得更好,但我找不到地方。如果有人能告诉我实现这一目标的最简单、最干净的方法,我将不胜感激
谢谢就递归而言,答案非常直截了当。不过,我更喜欢Try模式,而不是
null
返回
bool TryFind(string url, Category current, out Category found) {
if (category.Url == url) {
found = current;
return true;
}
foreach (var child in current.Children) {
if (TryFind(url, child, out found)) {
return true;
}
}
found = null;
return false;
}
你的问题提到你已经看到它做得“更好”。你能详细说明一下吗?我不太明白你的意思 下面是一个简单的递归算法:
public Category FindCategory(Category category, string url)
{
if(category.Url == url)
{
return category;
}
Category solution = null;
foreach(Category child in category.Children)
{
solution = FindCategory(child, url);
if(solution != null)
{
return solution;
}
}
return null;
}
我想您可以使用堆栈数据结构。比如:
public Category FindCategory(Category category, string url) {
Stack<Category> categoryStack = new Stack<Category>();
categoryStack.Push(category);
while(categoryStack.Peek() != null) {
Category cat = categoryStack.Pop();
if(cat.Url == url) {
return cat;
}
foreach(Category child in cat.Children) {
categoryStack.Push(child);
}
}
return null;
}
公共类别FindCategory(类别,字符串url){
Stack categoryStack=新堆栈();
categoryStack.Push(类别);
while(categoryStack.Peek()!=null){
Category cat=categoryStack.Pop();
如果(cat.Url==Url){
返回猫;
}
foreach(儿童类别中的儿童){
categoryStack.Push(子级);
}
}
返回null;
}
您是从SQL获取数据吗?我不理解您的匹配条件。给定一个类别C1和一个url U,您是否在寻找另一个类别C2,其中C2.url==U?“我希望得到url与该类别或其任何子类别(或其子类别等)匹配的类别”-如果这是您想要的,则结果应为布尔值,因为结果将始终是您给出的实例,或者为null。或者你是想说你希望得到一个url与给定url匹配的类别吗?注意:这将找到与之匹配的子类别。你应该使用JaredPar的尝试。如果你想知道父母是否有该url,或者孩子是否有该url,我很高兴,但我接受了Nick Bray的回答,因为他的方法的签名与我所追求的匹配。
public Category FindCategory(Category category, string url) {
Stack<Category> categoryStack = new Stack<Category>();
categoryStack.Push(category);
while(categoryStack.Peek() != null) {
Category cat = categoryStack.Pop();
if(cat.Url == url) {
return cat;
}
foreach(Category child in cat.Children) {
categoryStack.Push(child);
}
}
return null;
}