Avatar billede sholm Nybegynder
17. september 2007 - 13:38 Der er 15 kommentarer og
1 løsning

Rekursiv søgning

Hej
Jeg har en TreeNodeCollection hvor i jeg gerne vil søge efter en værdi. Jeg har lavet en rekursiv funktion til at gøre det, men der er en fejl et eller andet sted jeg ikke kan finde - nogen der er vågen? :)

private TreeNode findNode(TreeNodeCollection t, string strId)
    {
        TreeNode node = new TreeNode();

        foreach (TreeNode n in t)
        {
            if (n.ChildNodes.Count >= 1)
            {
                if (n.Value == strId)
                {
                    node = n;
                }
                else
                {
                    findNode(n.ChildNodes, strId);
                }
            }
            else
            {
                if (n.Value == strId)
                {
                    node = n;
                }
            }
        }

        return node;
    }
Avatar billede erikjacobsen Ekspert
17. september 2007 - 13:54 #1
du glemmer værdien der returneres fra findNode. Men det kan nok gøres lidt simplere (helt utestet):

    private TreeNode findNode(TreeNodeCollection t, string strId)
    {
        TreeNode node = null;

        foreach (TreeNode n in t)
        {
            if (n.Value == strId)
            {
              node = n;
            }
            else
            {
              node = findNode(n.ChildNodes, strId);
            }
        }

        return node;
    }
Avatar billede kalp Novice
17. september 2007 - 13:56 #2
enig med erik, at det kan gøres pænere i hvertfald... men din egen kode rettet til på en grim måde så tror jeg den vil fungere med


private TreeNode findNode(TreeNodeCollection t, string strId)
    {
        TreeNode node = null;

        foreach (TreeNode n in t)
        {
            if (n.ChildNodes.Count >= 1)
            {
                if (n.Value == strId)
                {
                    node = n;
break;
                }
                else
                {
                  node = findNode(n.ChildNodes, strId);
if(node != null) break;
                }
            }
            else
            {
                if (n.Value == strId)
                {
                    node = n;
                }
            }
        }

        return node;
    }
Avatar billede sholm Nybegynder
17. september 2007 - 13:59 #3
Sådan her må det være :) - jeg havde som erik skriver glemt at tildele værdien.

Smid et svar begge to så skal i få point :)

private TreeNode findNode(TreeNodeCollection t, string strId)
    {
        TreeNode node = null;

        foreach (TreeNode n in t)
        {
            if (n.Value == strId)
            {
                node = n;
            }
            else
            {
                node = findNode(n.ChildNodes, strId);
            }

            if (node != null)
            {
                break;
            }
        }

        return node;
    }
Avatar billede kalp Novice
17. september 2007 - 14:02 #4
:)
Avatar billede erikjacobsen Ekspert
17. september 2007 - 14:09 #5
Måske endda:

    du glemmer værdien der returneres fra findNode. Men det kan nok gøres lidt simplere (helt utestet):

    private TreeNode findNode(TreeNodeCollection t, string strId)
    {
        foreach (TreeNode n in t)
        {
            if (n.Value == strId)
            {
              return n;
            }
            else
            {
              return findNode(n.ChildNodes, strId);
            }
        }

        return null;
    }
Avatar billede sholm Nybegynder
17. september 2007 - 14:28 #6
Den kan jeg ikke lige få til at virke, den returnerer null når den ikke burde. Men den er ellers nydelig :)
Avatar billede kalp Novice
17. september 2007 - 14:30 #7
Det skal nok være

private TreeNode findNode(TreeNodeCollection nodes, strId)
{
    foreach(TreeNode node in nodes)   
    {
        if(node.Value == strId) return node;
        TreeNode foundNode = findNode(node.ChildNodes, strId);
          if(foundNode != null) return foundNode;
    }
return null;
}
Avatar billede erikjacobsen Ekspert
17. september 2007 - 14:34 #8
Det er korrekt. Den er lidt lusket. 2 secs.
Avatar billede kalp Novice
17. september 2007 - 14:34 #9
Rekursive metoder er altid luskede hvis man ikke har rørt ved dem i et stykke tid:D
Avatar billede erikjacobsen Ekspert
17. september 2007 - 14:35 #10
Utestet, men bedre, måske ;)

    private TreeNode findNode(TreeNodeCollection t, string strId)
    {
        if (n.Value == strId)
        {
          return n;
        }
        foreach (TreeNode n in t)
        {
          TreeNode foundNode = findNode(n.ChildNodes, strId);
          if(foundNode != null) return foundNode;
        }
        return null;
    }
Avatar billede erikjacobsen Ekspert
17. september 2007 - 14:36 #11
Nej, glem lige den ... der fik blandt kul og koks sammen... ;)
Avatar billede erikjacobsen Ekspert
17. september 2007 - 14:36 #12
...der fik jeg blandet kul og koks sammen... ;)
Avatar billede sholm Nybegynder
17. september 2007 - 14:42 #13
Kalps sidste version virker, som den skal.

Skal vi ikke slutte den her? :)

Tak for hjælpen folkens.

P.S. Erik smid et svar, så kan i dele hvis det er ok?
Avatar billede kalp Novice
17. september 2007 - 14:45 #14
ingen årsag:)
Avatar billede erikjacobsen Ekspert
17. september 2007 - 14:51 #15
Jeg samler slet ikke på point, tak.
Avatar billede sholm Nybegynder
17. september 2007 - 14:55 #16
Okay :)

Så går det hele til kalp.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester