209 messaggi dal 23 agosto 2007
Salve,

ho una lista di nodi che voglio ordinare in base alla data. Utilizzo l'interfaccia IComparer e il metodo Compare per questo e tutto funziona.
La difficoltà risiede nel fatto che alcuni nodi possono non avere data. In tal caso la data verrebbe reperita successivamente calcolandola come "media" del nodo precedente e successivo. Quindi l'ordine è rilevante: non posso semplicemente spostare in coda alla lista i nodi senza data, ma la loro posizione dovrebbe rimanere inalterata, mentre i nodi con data dovrebbero essere ordinati fra loro
Con un esempio:
  
Nodo 1: 10/02  
Nodo 2:   -  
Nodo 3: 15/03  
Nodo 4:  24/02  
  
Dovrebbe generare:   
Nodo 1: 10/02  
Nodo 2:   -  
Nodo 4:  24/02  
Nodo 3: 15/03  

Il Nodo 2 mantiene la posizione e il nodo 4 viene spostato prima del nodo 3.
Durante il confronto, nel caso una delle due date sia nulla, ritorno "0" nel metodo Compare. Vorrei insomma specificare che se una data e' nulla "mantieni l'ordine attuale". Purtroppo pero' questa indicazione non sembra corretta, in quanto ottengo un ordnamento non come quello previsto. Qui il codice:
public int Compare(NodeMap node1, NodeMap node2)  
        {  
            int res = 0;   
            if (string.IsNullOrEmpty(node1.TaskDue) || string.IsNullOrEmpty(node2.TaskDue))  //NON MUOVERE  
            {  
                res = 0;  
            }  
            else if (Convert.ToDateTime(node1.TaskDue).Date < Convert.ToDateTime(node2.TaskDue).Date) //Nodo2 viene dopo  
            {                                  
                res = -1;                  
            }  
            else if (Convert.ToDateTime(node1.TaskDue).Date > Convert.ToDateTime(node2.TaskDue).Date)  
            {  
                res = 1;  
            }  
            if (node1.TaskDue.Equals(node2.TaskDue))  
            {  
                res = 0;  
            }  
            return res;  
        }

Sapreste indicarmi come modificare le condizioni in modo opportuno o eventualmente una soluzione alternativa in grado di ordinare i nodi come desiderato?
Grazie
Ciao,

purtroppo non credo che per il tuo caso un comparer possa risolvere il problema. Il valore 0, infatti, non indica "non spostare", ma semplicemente che i due dati verificati sono uguali; questo, applicato all'algoritmo QuickSort che internamente il framework usa per eseguire l'ordinamento provoca l'errato risultato che ottieni.

Nota anche che per la particolare natura del quicksort, non solo i valori null vengono spostati, ma addirittura il tuo ragionamento provoca anche un errore sul confronto dei dati non nulli.

Secondo me non è banale scrivere un comparer che si comporti come dici applicato ad una lista di nodi. Magari mi sbaglio, ma alle 10.57 di mattina non mi viene in mente granché

Fossi in te, per non saper né leggere né scrivere, risolverei la cosa in maniera algoritmica, ossia
1) rimuovendo i nodi nulli (e salvando il relativo indice)
2) ordinando la lista di dati non nulli
3) reinserendo i nodi nulli

Puoi fare anche un ExtensionMethod che realizzi questa logica, magari corredato da 2-3 unit test che ne verifichino la correttezza.

Ciao,
m.
209 messaggi dal 23 agosto 2007
Grazie Cradle del suggerimento.
Alla fine ho fatto esattamento come indicato e funziona bene.

Giusto per curiosità, c'è qualche pattern per definire/usare unit tests per verificare la correttezza dell'ordinamento?
Sapresti darmi qualche indicazione a riguardo?

Grazie
Ah beh, in questo caso semplicemente creare il caso d'esempio (magari anche degenere, tipo lista vuota o con soli null...) ordinare e verificare che l'elemento 1 sia quello che ti aspetti, il 2 pure, e così via..

List<..> lista = new List<..> { item1, item2, item3 };
lista.MySpecialSort();
Assert.AreEqual(lista[0], item3)
Assert.AreEqual(lista[1], item2)
..
Ciao,
m.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.