2011-06-22 10 views
7
Foo().OrderBy(x=> x.Name) 

¿Qué pasa si quiero que la colección se ordene de esa manera, pero exactamente un elemento con Id == (digamos 314) siempre debe estar al principio, independientemente de su nombre.Linq - advanced .OrderBy

Respuesta

21

Puede clasificar en dos rondas:

Foo().OrderBy(x => x.Id == 314 ? 0 : 1).ThenBy(x => x.Name) 

Tal vez esto es aún más simple (suponiendo booleano false lucían antes booleano verdadero)

Foo().OrderBy(x => x.Id != 314).ThenBy(x => x.Name) 
+1

falsas tipo de Boole antes de verdad. ILSpy muestra que 'Boolean.CompareTo' devuelve 0 si los valores son iguales, -1 si' this' es falso, de lo contrario 1. – user7116

+0

¡Es bueno saberlo! gracias. – jishi

3

Personalmente manejaría que después de la cliente, pero si desea una forma LINQ, entonces probablemente evitaría Concat - será una consulta más compleja. Me gustaría ir para:

int id = 314; 
var data = Foo().OrderBy(x => x.Id == id ? 0 : 1).ThenBy(x => x.Name) 
1

Intente utilizar Union:

var foo = Foo(); 
foo.Where(x => x.id == 314).Union(foo.OrderBy(x => x.Name)); 
+0

Según MSDN (ver enlace arriba), esta es una solución mejor que cualquier cosa que implique 'Concat' porque' Concat' permite duplicados. –

+0

'Single' devuelve un solo objeto; no puede llamar a' Union' en eso. –

+0

Esto invocaría a Foo() dos veces, lo que no siempre es una gran idea. – jishi

Cuestiones relacionadas