我有以下课程:
public class Category {
public string Name { get; set; }
public Category Parent { get; set; }
public string Url { get; set; }
public List<Category> Children { get; set; }
}
现在给出一个Category和url的实例。我希望得到网址与类别或其中任何一个(或他们的孩子等)匹配的类别。
因此我的功能将具有以下签名:
public Category FindCategory(Category category, string url);
我知道递归是要走的路,我已经设法提出了解决方案。但是我肯定看到它做得更好但我找不到哪里。如果有人能告诉我最简单,最干净的方法,我会很感激。
由于
答案 0 :(得分:3)
就递归而言,答案非常简单。我希望尝试模式超过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;
}
你的问题提到你看到它做得更好“。你能详细说明一下吗?我不太清楚你的意思。
答案 1 :(得分:1)
这是一个简单的递归算法:
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;
}
答案 2 :(得分:0)
我想你可以使用堆栈数据结构。类似的东西:
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;
}