He intentado obtener OrderBy
en una instrucción LINQ para trabajar con un objeto anónimo, pero ahora no lo he logrado.Orden LINQPor objeto anónimo con comparador de proyección
yo nos registramos estos ya:
Anonymous IComparer implementation
C# linq sort - quick way of instantiating IComparer
How to sort an array of object by a specific field in C#?
Me pasé un par de horas probando diferentes enfoques, pero tiene que ser algo que me falta.
Digamos que es la siguiente clase:
public class Product
{
public int Id {get; set;}
public string Name {get; set;}
public int Popularity {get; set;}
public decimal Price {get; set;}
}
Y products
es una lista de estos objetos.
¿Cómo puedo completar esta declaración LINQ para que funcione con el objeto anónimo?
Para ser claro, sé que puedo hacer esto de otra manera, pero estaría muy interesado en aprender cómo hacer que este ejemplo en particular funcione.
var sortedProducts = products
.OrderBy(p =>
new {p.Popularity, p.Price},
[IComparer magic goes here]);
Parece que debería ser posible con una implementación de la ProjectionComparer
:
http://code.google.com/p/edulinq/source/browse/src/Edulinq/ProjectionComparer.cs?r=0c583631b709679831c99df2646fc9adb781b2be
Alguna idea de cómo hacer esto?
ACTUALIZACIÓN:
Me hicieron una prueba de rendimiento rápido en esto - la solución comparador anónima vs orderby.thenby estándar y parece que la solución anónima es bastante más lenta que es probablemente lo que podríamos haber esperado de todos modos.
numProd | Anon | chained orderby clauses
10 000 | 47 ms | 31 ms
100 000 | 468 ms | 234 ms
1 000 000| 5818 ms | 2387 ms
5 000 000| 29547 ms| 12105 ms
¿Cuál es su criterio de pedido? ¿Estás diciendo que debería ser primero por Popularidad, luego por precio? ¿Por qué no hacer OrderBy en popularidad y luego ThenBy en el precio? –
@JamesMichaelHare - digamos una mayor popularidad como factor principal, un precio más bajo como factor secundario si eso marca alguna diferencia en el ejemplo. EDITAR: Sé que puedo hacer esto, pero me pregunto si el enfoque con el objeto anónimo funcionará en absoluto, y si es así, no puedo entender cómo. –
¿Por qué utilizar un objeto anónimo en absoluto en el OrderBy() entonces? ¿Por qué no solo: 'products.OrderByDescending (p => p.Popularity) .ThenBy (p => p.Price)' –