2009-06-09 7 views
7

Supongamos que tengo una clase Persona con propiedades de Nombre, Edad, Nivel.C# List <> Ordene con 3 propiedades .Net 2.0

Sé cómo realizar un pedido por una de las propiedades, con

 PersonList.Sort(delegate(Person p1, Person p2) { 
      return p1.Name.CompareTo(p2.Name); 
     }); 

Pero, ¿cómo puedo pedir por Nombre, edad y nivel.

Un Equivalente de la sentencia SQL: Por nombres, edad, nivel

Gracias

+0

¿Tiene C# 3.0/.NET 3.5 disponible? – Noldorin

Respuesta

28

Adaptando su código actual:

PersonList.Sort(delegate(Person p1, Person p2) { 
     int r = p1.Name.CompareTo(p2.Name); 
     if (r == 0) r = p1.Age.CompareTo(p2.Age); 
     if (r == 0) r = p1.Level.CompareTo(p2.Level); 
     return r; 
    }); 

o, una solución simple LINQ-ish:

PersonList = PersonList.OrderBy(p => p.Name) 
         .ThenBy(p => p.Age) 
         .ThenBy(p => p.Level).ToList(); 
+0

Gracias por la corrección, Marc. Me di cuenta de mi error, pero Internet está escamosa y tenía problemas para editarlo. –

+0

Ah bueno, lo editaste. Encadenar OrderBys no funciona :) – Thorarin

+0

¡¡¡Bien !!! Al estar en .Net 2.0, la primera solución funciona perfectamente. Saludos cordiales. –

2

Yo implementaría IComparable en su clase Person. En su método de comparación personalizada, puede establecer la lógica para comparar en las tres propiedades y asegurarse de que las tres tengan el "peso" adecuado (por ejemplo, si dos instancias de Persona tienen el mismo nombre, debe ordenarlas a continuación en Edad o Nivel)

4

¿Ha considerado cambiar a .NET 3.5 y usar LINQ? Este tipo de cosas son muy fáciles en LINQ:

personList = personList.OrderBy(p => p.Name). 
    ThenBy(p => p.Age).ThenBy(p => p.Level).ToList(); 
1

Asumiendo que están utilizando .NET 3,5

IQueryable<Person> people = PersonList.AsQueryable(); 

return people.OrderBy(x => x.Name).ThenBy(x => x.Age).ThenBy(x => x.level); 
0

Si tiene C# 3.0 disponible (soporte LINQ), entonces usted puede hacer lo siguiente:

var result = (from p in PersonList 
       orderby p.Name, p.Age, p.Level 
       select p).ToList(); 
0

¿Has considerado LINQ to Objects?

var x = (from p in PersonList 
     orderby p.Name, p.Age, p.Level 
     select p).ToList(); 
0

es necesario llamar a CompareTo en la primera propiedad que desea ordenar por, obtener el valor que se devuelve, y si es 0, entonces llaman CompareTo en la siguiente propiedad, y repetir, cada vez que 0 es devuelto, continúe en la propiedad siguiente hasta que obtenga un valor distinto de cero (que luego devuelve) o hasta el final de las propiedades que desea ordenar.

0
var result = from p in persons 
      orderby p.Name, p.Age, p.Level 
      select p; 
Cuestiones relacionadas