2012-01-27 78 views
1

我有下面的類:遞歸搜索類別及其子女

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

我知道遞歸是要走的路,我設法拿出一個解決方案。不過,我已經看到它做得更好,但我找不到在哪裏。如果有人能夠向我展示最簡單,最簡潔的方式來實現這一目標,我將非常感激。

感謝

+2

你先展示你的代碼:) – 2012-01-27 23:43:28

+0

,您在SQL把你的數據嗎? – 2012-01-27 23:54:46

+0

我不明白你的匹配標準。鑑於類別C1和URL U,你是否正在尋找C2.url == U? – kmote 2012-01-28 00:04:05

回答

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

注意:這將找到匹配你的子類別應該使用JaredPar的嘗試,如果你想知道如果父母有url或一個孩子有它 – 2012-01-28 00:13:00

+0

嗨,謝謝,這個解決方案是完美的。 – nfplee 2012-01-28 16:42:44

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

您的問題提到你看到它完成「更好」。你能詳細解釋一下嗎?我不太清楚你的意思。

+0

你好,歡迎來到這裏,但是我已經接受了Nick Bray的回答,因爲他的方法簽名與我之後的簽名相符。 – nfplee 2012-01-28 16:43:43

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