2012-03-15 43 views
6

tengo esta clase:Ordenar lista de objetos por propiedades C#

public class Leg 
{ 
    public int Day { get; set; } 
    public int Hour { get; set; } 
    public int Min { get; set; } 
} 

tengo una función que obtiene una lista de las piernas, llamados GetLegs()

List<Leg> legs = GetLegs(); 

Ahora me gustaría para ordenar esta lista. Así que primero tengo que considerar el día, luego la hora y finalmente el minuto. ¿Cómo debo resolver esta clasificación?

Gracias

+4

¿Por qué no utiliza la estructura nativa 'DateTime'? Comparación y, por lo tanto, ordenación compatible desde el primer momento. Consulte http://msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx –

+1

Por cierto, mire las preguntas relacionadas a la derecha, hay muchos temas similares, Necesito aprender a buscar un poco. Uno por ejemplo (el primero que miré) ... http://stackoverflow.com/questions/3309188/c-net-how-to-sort-a-list-t-by-a-property-in-the -objeto – SkonJeet

+0

Como veis, es mi primera publicación aquí, así que probablemente me acostumbraré más a cómo funcionan las cosas;) Gracias por la respuesta, desafortunadamente, no puedo usar DateTime en este escenario. – Engern

Respuesta

10

Tal vez algo como esto:

List<Leg> legs = GetLegs() 
       .OrderBy(o=>o.Day) 
       .ThenBy(o=>o.Hour) 
       .ThenBy(o=>o.Min).ToList(); 
1

Puede escribir una costumbre IComparer<Leg> y pasarlo al método List<T>.Sort.

Como alternativa, puede implementar IComparable<Leg> en su clase y simplemente llame al List<T>.Sort.

+0

Sin necesidad de hacer eso, puede simplemente escribir una lambda anónima en 'List .Sort'. –

+2

Por razones de reutilización de código, la implementación de 'IComparable ' puede ser la mejor alternativa si la clasificación/comparación debe realizarse en más de una ubicación. – Matthias

+0

ese es un muy buen punto. –

0

Supongo que esto ayudaría.

var o = legs.OrderBy(x => x.Day) 
      .ThenBy(x => x.Hour) 
      .ThenBy(x => x.Min); 
0

que necesita para implementar la interfaz IComparable<T> en su clase para permitir una manera más intuitiva para los objetos a clasificar en el lenguaje C#. Cuando una clase implementa IComparable, también debe implementar la clase public methodCompareTo(T).

Leg implementa IComparable<Leg>, lo que significa una instancia Leg se puede comparar con otros Leg casos.

#region "Leg Class that implements IComparable interface" 
    public class Leg:IComparable<Leg> 
    { 
     public int Day { get; set; } 
     public int Hour { get; set; } 
     public int Min { get; set; } 

     public int CompareTo(Leg leg) 
     { 
      if (this.Day == leg.Day) 
      { 
       if (this.Hour == leg.Hour) 
       { 
        return this.Min.CompareTo(leg.Min); 
       } 
      } 
      return this.Day.CompareTo(leg.Day); 
     } 
    } 
    #endregion 


    //Main code 
    List<Leg> legs = GetLegs(); 
    legs.Sort(); 
Cuestiones relacionadas