Avatar billede websam Nybegynder
13. februar 2009 - 21:08 Der er 11 kommentarer og
1 løsning

Hjælp til en recursiv function

Hejsa,

Jeg har en generic list som jeg skal lave en rekursiv metode til. Jeg er kommet frem til dette :

private string loadSites(int id, List<Site> data)
{
    string result = "";
    result += "<nodes>";
    foreach (Site site in data)
    {
        result += "<node text=\""+ site.MenuName +"\" url=\""+ site.SiteUrl +"\">";
        loadSites(site.Id, data);
        result += "</node>";
    }
    result += "</nodes>";
    return result;
}

Det virker dog ikke helt som det skal. Når jeg kalder min metode inde i loopen crasher skidtet. Er der en der kan hjælpe mig færdig med dette ?

/websam
Avatar billede erikjacobsen Ekspert
13. februar 2009 - 21:23 #1
En rekursiv funktion skal starte med en "if" der afgør om man er færdig. Du har ingen "if". Hvad er kriteriet for at stoppe?

(...eller en "if" et andet sted i funktionen...)
Avatar billede websam Nybegynder
13. februar 2009 - 21:29 #2
Jeg har to felter i min database Id og ParentId. Alle top noder har ParentId = 0 og under noder har så ParentId = Id, så hvis en top node har under noder skal functionen loades igen.

Gav det nogen mening ?
Avatar billede erikjacobsen Ekspert
13. februar 2009 - 21:38 #3
Nej ;)

Hvad indeholder dit site-object?

Og hvad skal du med Id, når du ikke bruge det?
Avatar billede websam Nybegynder
13. februar 2009 - 21:48 #4
Mit site object indeholder :

Id, ParentId, MenuName og SiteUrl

og resultatet skal være noget i stil med dette :

Node 1
- Node 1.1
- Node 1.2
Node 2
- Node 2.1
-- Node 2.1.1
-- Node 2.1.2
- Node 2.2
Node 3
- Node 3.1
- Node 3.2

Altså skal jeg rende min generic list igennem for at liste alle top noder med tilhørende under noder. Og for at forklare top/under noder så ser Id og ParentId således ud i min database:

1 - 0
2 - 0
3 - 1
4 - 2
5 - 2
6 - 3

Altså alle top noder har ParentId = 0 og alle undernoder har ParentId = Id der høre til over noden.

Hjalp det på det ?
Avatar billede erikjacobsen Ekspert
13. februar 2009 - 21:53 #5
Måååske noget i retning af:

private string loadSites(int id, List<Site> data)
{
    string result = "";
    result += "<nodes>";
    foreach (Site site in data)
    {
        if (site.ParentId==id) {
        result += "<node text=\""+ site.MenuName +"\" url=\""+ site.SiteUrl +"\">";
        loadSites(site.Id, data);
        result += "</node>";
        }
    }
    result += "</nodes>";
    return result;
}

kald den med

loadSites(0,data);
Avatar billede websam Nybegynder
13. februar 2009 - 22:08 #6
Ja så kommer den da ikke med fejl mere ;o) Men den loader kun top noderne så if sætningen må ikke være rigtig ?
Avatar billede erikjacobsen Ekspert
13. februar 2009 - 22:31 #7
Jo, den er korrekt nok. Men du skal nok rette

  loadSites(site.Id, data);

til

  result+=loadSites(site.Id, data);
Avatar billede websam Nybegynder
13. februar 2009 - 22:56 #8
Ok det hjalp da lidt mere på det så skal jeg bae lige have styr på disse to :

result += "<nodes>";
result += "</nodes>";

De skal kun laves først og sidst, som en wrapper om noderne, men det kommer til at se således ud :

<nodes>
  <node text="Forside" url="forside.aspx">
    <nodes><-- DUER IKKE
      <node text="Om os" url="omos.aspx">
        <nodes></nodes><-- DUER IKKE
      </node>
      <node text="Kontakt" url="kontakt.aspx">
        <nodes></nodes><-- DUER IKKE
      </node>
    </nodes><-- DUER IKKE
  </node>
  <node text="Ledige Stillinger" url="ledige-stillinger.aspx">
    <nodes><-- DUER IKKE
      <node text="Montør" url="montor.aspx">
        <nodes></nodes><-- DUER IKKE
      </node>
      <node text="Sælger" url="saelger.aspx">
        <nodes></nodes><-- DUER IKKE
      </node>
    </nodes><-- DUER IKKE
  </node>
</nodes>
Avatar billede erikjacobsen Ekspert
13. februar 2009 - 23:06 #9
Så skal du gøre det udenfor funktionen:

String s="";
s+="<nodes>";
s+=loadSites(0,data);
s+="</nodes>";
Avatar billede websam Nybegynder
13. februar 2009 - 23:24 #10
Ja det fandt jeg også frem til ;o)

Smid et svar så er der point på vej og tak for hjælpen.
Avatar billede erikjacobsen Ekspert
13. februar 2009 - 23:27 #11
Jeg samler slet ikke på point, tak. Svar selv, og accepter dit eget svar.
Avatar billede websam Nybegynder
17. februar 2009 - 10:59 #12
Ok
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