[Visual C#] Come ottimizzare un loop ricorsivo?

lunedì 02 giugno 2008 - 14.58

paquito_ita Profilo | Senior Member

Ciao,

devo creare una descrizione di un sito web usando SIOC (web semantico) usando C#. In particolare la struttura prevede diversi spazi (projects) ognuno con una root folder che contiene documenti e/o cartelle figlie.

I dati sensibili risiedono su un DB MS SQL server e per estrarli uso il seguente approccio (ricercando la max generalità ed evitando di usare statement di SQL Server):

1) Eseguo UNA sola query sulla table FOLDER per ottenere ogni cartella con i relativi dati, l'ID e quello della cartella padre (rootfolder ha ParentID = 0) e UNA query anche per la table DOCS per estrarre i dati sui documenti, in particolare FolderID indica a quale crtella appartiene il documento.

2) Creo tanti oggetti "FOLDER" quanti sono i dati restituiti dalla prima query e li inserisco in un vector (Vector<Folder>) che andrà come VALUE in una HashTable dove la KEY è Folder.ParentID. In tal modo per ogni FolderID avro', raggruppati in un unico Vector, tutte le cartelle figlio.

3) Estraggo quindi (per ogni progetto) dalla HashTable la cartella root e invoco il metodo ricorsivo appendChild:

public static void appendChild(int ID, Resource RES) { Vector<Folder> currFold = table.get(ID); for(int i=0; i<currFold.size(); i++) { //Extract the child and crate the relative resource if(table.containsKey(currFold[i].getID())) { appendChild(currFold[i].getID(), Resource newRES); }}}



In tal modo esploro in profondità la struttura gerarchica delle cartelle usando un approccio "left most". Tale procedimento dovrebbe essere fatto per una struttura di cartelle con 4 livelli di profondità (in media circa 30 cartelle in totale) contenenti documenti e che rappresenta la documents library di un progetto. Tale procedimento di descrizione della documents library va ripetuto per ogni progetto (circa 20 in totale).
Ad ogni modo dopo avere popoato la HashTable per ogni progetto ed usato il relativo contenuto eseguo il flush() dato che nn mi serve mantenerne poi il contenuto, visto che lo uso per creare dinamicamente "risorse" nell'ambito degli statement SIOC. Userei quindi solo una HashTable che ogni volta viene popolata e svuotata.

Vi pare che tale approccio sia valido oppure me ne consigliate un altro che sia piu' performante?
Cercando sempre di adottare una soluzione generale che non si appoggi a istruzioni specifiche di un database.

Grazie!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5