2012-01-27 15 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のインスタンスを与えられました。カテゴリが一致するカテゴリ、またはその子(またはその子など)を取得したいと考えています。私は再帰が進むべき道であると私は解決策を考え出すために管理している知っている

public Category FindCategory(Category category, string url); 

したがって、私の機能は、次の署名を持っているでしょう。しかし、私は間違いなくそれが良くなったのを見ましたが、私はどこに見つけることができません。誰かが私にこれを達成する最も簡単できれいな方法を示すことができたら、私はそれを感謝します。

ありがとうございました

+2

あなたはコードを最初に表示します:) –

+0

あなたはSQLからデータを取っていますか? –

+0

私はあなたの一致基準を理解していません。カテゴリC1とURL Uが与えられた場合、別のカテゴリC2を探していますか?C2.url == U? – kmote

答えて

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

注:親がURLを持っているか子供が持っているかを知りたければJaredParのTryを使うべきサブカテゴリが見つかります –

+0

こんにちは、ありがとう、このソリューションは完璧です。 – nfplee

3

答えはかなり簡単です。私はnull以上のTryパターンを好むでしょう。

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

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