【问题标题】:Recursive Searching Category and Their Children递归搜索类别及其子项
【发布时间】:2012-01-30 22:52:29
【问题描述】:

我有以下课程:

public class Category {
    public string Name { get; set; }
    public Category Parent { get; set; }
    public string Url { get; set; }
    public List<Category> Children { get; set; }
}

现在给出一个类别和 url 的实例。我希望获取 url 与该类别或其任何子项(或其子项等)匹配的类别。

因此我的函数将具有以下签名:

public Category FindCategory(Category category, string url);

我知道递归是要走的路,我已经设法想出了一个解决方案。但是我确实看到它做得更好,但我找不到在哪里。如果有人能告诉我实现这一目标的最简单和最干净的方法,我将不胜感激。

谢谢

【问题讨论】:

  • 您是从 SQL 中获取数据吗?
  • 我不明白您的匹配条件。给定一个类别 C1 和一个 URL U,您是否正在寻找另一个类别 C2,其中 C2.url == U?
  • “我希望获取 url 与类别或其任何子项(或其子项等)匹配的类别” - 如果这是您想要的,那么您的结果应该是布尔值,因为结果总是你给它的实例,或者为空。还是您的意思是说您希望获取其 url 与给定 url 匹配的类别?

标签: c# recursion


【解决方案1】:

就递归而言,答案非常简单。不过,我更喜欢 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;
}

您的问题提到您已经看到它做得“更好”。你能详细说明一下吗?我不太清楚你的意思。

【讨论】:

  • 嗨,干杯,这很好用,但我接受了 Nick Bray 的回答,因为他的方法签名与我所追求的相符。
【解决方案2】:

这是一个简单的递归算法:

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

【讨论】:

  • 注意:这将找到匹配的子类别,如果您想知道父母是否有 url 或孩子有它,应该使用 JaredPar 的 Try
【解决方案3】:

我想你可以使用堆栈数据结构。比如:

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

【讨论】:

    猜你喜欢
    • 2011-03-18
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2013-01-26
    • 1970-01-01
    • 2011-01-04
    相关资源
    最近更新 更多