2016-02-09 6 views
0

У меня есть следующий код, который сравнивает node.Text o каждого заданного набора узлов, а затем возвращает один, если они равны нулю в противном случае. Но моя проблема в том, что он просто сравнивает первых детей из-за nodes2.Nodes[ii], поэтому я знаю, что он не продвинется дальше.Как изменить эту функцию на рекурсивную функцию

Как я знаю, было ли это TreeNodeCollection было легко сделать рекурсивный для каждого узла и подузла, используя цикл foreach.

Но вот как я могу изменить код на рекурсивную версию? благодарим заранее!

public int Compare_ChildNodes(TreeNode nodes1, TreeNode nodes2) 
{ 
    int length_children1 = nodes1.Nodes.Count; 
    int length_children2 = nodes2.Nodes.Count; 
    int result_int = 1; 
    if (length_children1 != length_children2) 
    { 
     result_int = 0; 
    } 
    else 
    { 
     for (int ii = 0; ii < length_children1; ii++) 
     { 
      if (nodes1.Nodes[ii].Text.Equals(nodes2.Nodes[ii].Text)) 
      { 
       int ret = Compare_ChildNodes(nodes1.Nodes[ii], nodes2.Nodes[ii]); 
       result_int = ret; 
      } 
      else 
      { 
       result_int = 0; 
      } 
     } 
    } 

    return result_int; 
} 

ответ

1

У меня проблем нет. Вызов Compare_ChildNodes с nodes1.Nodes[ii] и nodes2.Nodes[ii] делает именно ту рекурсию, которую вы хотите.

Я просто предлагаю небольшую оптимизацию («ранний выход») для вашего кода:

public int Compare_ChildNodes(TreeNode nodes1, TreeNode nodes2) 
{ 
    int length_children1 = nodes1.Nodes.Count; 
    int length_children2 = nodes2.Nodes.Count; 
    int result_int = 1; 

    if (!nodes1.Text.Equals(nodes2.Text)) return 0; // not equal 
    if (length_children1 != length_children2) return 0; // not equal 

    return nodes1.Nodes.OfType<TreeNode>.Select((node, idx) => 
     Compare_ChildNodes(node, nodes2.Nodes[idx]).Any(result => result == 0) ? 0 : 1; 
} 

Я изменил сравнение для текста узла к другому уровню рекурсии, так что вы можете рекурсию с помощью LINQ.

Метод linq Any проверяет, выполнено ли какое-либо из сравнений (в методе Select) 0, указывающее, что коллекция дочерних узлов не равна.

Select вызывается для каждого TreeNode в node1.Nodes и с его индексом в этой коллекции. Таким образом, вы можете использовать этот индекс, чтобы получить соответствующий узел от node2.Nodes и вызвать Compare_ChildNodes для этих двух.

Как только вы найдете неравные (дочерние) узлы, вы можете вернуть 0 и не нужно продолжать сравнивать другие узлы.

Если вы не можете использовать заявление Linq (для рамочных причин или других), вы можете использовать свой for цикл:

for (int idx = 0; idx < length_children1; idx++) 
    if (Compare_ChildNodes(nodes1.Nodes[idx], nodes2.Nodes[idx]) == 0) 
     return 0; 
return 1; 
+0

спасибо! но у меня есть эта ошибка: «Ошибка « System.Linq.ParallelEnumerable.OfType (System.Linq.ParallelQuery) »- это« метод », который недопустим в данном контексте» –

+0

@SaberJalilzadeh это должно быть действительно 'System.Linq.Enumerable.OfType '. Можете ли вы проверить свои заявления 'using'? –

+0

@SaberJalilzadeh добавил к моему ответу версию, отличную от linq. –

Смежные вопросы