Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 递归搜索范畴及其子类_C#_Recursion - Fatal编程技术网

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;
}