2010-03-09 7 views
6

Il metodo CompareTo() per la mia classe è dinamico e può variare da un semplice confronto a un confronto su un numero di colonne. Questo è tutto determinato in fase di esecuzione, e funziona benissimo.Disattiva efficacemente Sort() all'interno di un override di CompareTo()?

Ma in alcuni casi, desidero qualsiasi tentativo di ordinare una raccolta dei miei oggetti utilizzando il confronto predefinito per non fare nulla.

Avere CompareTo() restituire uno 0 per qualsiasi confronto, con mia sorpresa, non funziona. L'elenco viene riorganizzato in un ordine strano, apparentemente casuale.

C'è un modo per farlo nell'implementazione del metodo CompareTo()? Preferirei non gestirlo a livello di raccolta sostituendo Sort().

risposta

1

Questo perché QuickSort non è un stable sort. Non vedo una buona opzione per risolvere questo problema nel metodo CompareTo a meno che tu non possa in qualche modo ottenere l'indice dell'elemento.

+0

Grazie, ha perfettamente senso. Mi aspettavo che fosse così, ma la classe Data Algorithms era molto tempo fa ... – richardtallent

0

Non l'ho provato, ma come suggerimento, cosa succede se provi a tornare sempre 1 o sempre -1?

+2

Questo viola le proprietà del metodo CompareTo: Se A.CompareTo (B) restituisce un valore diverso da zero, quindi è necessario B.CompareTo (A) per restituire un valore del segno opposto. –

+0

Capito. Grazie @Kevin – Javier

0

È necessario eseguire l'override di Sort(). L'implementazione predefinita di Sort() non offre alcuna garanzia su come utilizzerà CompareTo() per arrivare a una raccolta ordinata, quindi non c'è alcun modo di utilizzarlo per fare in modo che Sort() faccia la cosa giusta.

Problemi correlati