2009-05-15 14 views
14

Tenemos una lista genérica (del producto) que debe clasificarse en dos o más propiedades de la clase Producto.Ordenar Lista genérica en dos o más valores

La clase de producto tiene las propiedades "Popular" numérica (asc), "Pulsada" numérica (desc), "Nombre" cadena (asc). Para nombrar las propiedades, queremos que la lista se ordene.

¿Cómo se puede ordenar con una declaración lamba? Si ha encontrado para ordenar la lista basada en una propiedad.

Respuesta

3

Lo siento, pero ¿conoces algún C#?

products.OrderBy(p => p.Popular). 
    ThenByDescending(p => p.Clicked). 
    ThenBy(p => p.Name); 

¿Puede obtener lo que necesita de esto?

+0

brillante! No sabía sobre el "ThenBy" – BrokeMyLegBiking

30

EDIT Acaba de darse cuenta de que esta era una pregunta de VB. Aquí está la solución VB.Net

Dim list = GetSomeList() 
Dim sorted = list. _ 
    OrderBy(Function(x) x.Popular). _ 
    ThenBy(Function(x) x.Clicked). _ 
    ThenBy(Function(x) x.Name) 

C# version. Pruebe las siguientes

var list = GetSomeList(); 
var sorted = list.OrderBy(x => x.Popular).ThenBy(x => x.Clicked).ThenBy(x => x.Name); 
5

Para responder a su pregunta acerca de una expresión lambda, es demasiado complejo para poner en una expresión lambda, como VB no admite expresiones lambda multilínea.

Para una solución no LINQ:

se necesita un método denominado como un comparador:

Private Function Comparer(ByVal x As Product, ByVal y As Product) As Integer 
    Dim result As Integer = x.Popular.CompareTo(y.Popular) 
    If result = 0 Then 
     result = x.Clicked.CompareTo(y.Clicked) 
     If result = 0 Then 
      result = x.Name.CompareTo(y.Name) 
     End If 
    End If 
    Return result 
End Function 

Uso:

theList.Sort(AddressOf Comparer) 
+0

Resolvió un problema que tenía. ¡Gracias! – John

+0

@Guffa - VB admite expresiones lambda multilínea. –

+0

@roryap: Sí, ahora sí. No cuando la respuesta fue escrita. – Guffa

2
List<Product> sortedProducts = null; 
sortedProducts = products.OrderBy(p => p.Popular) 
         .ThenByDescending(p => p.Clicked) 
         .ThenBy(p => p.Name) 
         .ToList();