2010-12-21 7 views
13

Tengo una clase de persona con tres campos, Título, Nombre, Sexo y me gustaría crear una clasificación personalizada para que primero la ordene por Título, luego por Nombre y luego por Género ascendente:Ordenación personalizada (IComparer en tres campos)

public class SortPerson : IComparer 
    { 
     public int Compare(object x, object y) 
     { 
      (…) 
     } 
    } 

sé cómo hacer esto de una sola variable con el que comparar: Pero ¿cómo iba a tener que proceder con tres?

public class SortPerson : IComparer 
     { 

int IComparer.Compare(object a, object b) 
    { 
     Person p1=(Person)a; 
     Person p2=(Person)b; 
     if (p1.Title > p2.Title) 
     return 1; 
     if (p1.Title < p2.Title) 
     return -1; 
     else 
     return 0; 
    } 
} 

Muchas gracias,

+2

¿Qué piensa usted que debería hacer? Un campo, naturalmente, debería ser más importante, ¿correcto? ¿Luego otro? Y finalmente el último? Entonces compara el primer campo. Si ese resultado es 0, entonces compare el segundo. Si ese resultado es 0, compare el tercero. Devuelve el resultado. Convierte eso en un método y tienes un comienzo. Luego refactorízala. –

Respuesta

28
//Assuming all the fields implement IComparable 
int result = a.field1.CompareTo(b.field1); 
if (result == 0) 
    result = a.field2.CompareTo(b.field2); 
if (result == 0) 
    result = a.field3.CompareTo(b.field3); 
return result; 
4

No sé cuál es el uso que tiene para el comparador, pero tal vez usted podría utilizar en lugar de un comparador del "fin de la" declaración de LINQ, que permite ordenar por diversos campos:

var orderedListPersons = 
    from p in listPersons 
    orderby p.Title, p.Name, p.Gender 
    select person; 

ordenarán listPersons de la manera que desee. También puede usar los métodos LINQ OrderBy y ThenBy para lo mismo con una sintaxis diferente:

var orderedlistPersons = listPersons.OrderBy(p => p.Title).ThenBy(p => p.Name).ThenBy(p => p.Gender); 
Cuestiones relacionadas