Anteriormente ya hablamos de varios operadores de linq y ahora volvemos al tema para ver dos nuevos operadores que seguramente son de los más usados.
Para los que no sepan que es linq, les recomiendo leer ¿Qué es linq?, para los demás sigamos adelante.
En este post, vamos a ver dos operadores y como he dicho seguramente van a ser de los más usados, estos son:
- OrderBy
- OrderByDescending
Como su nombre indica, estos operadores, lo que nos van a permitir es ordenar el conjunto de datos de forma ascendente (OrderBy) o descendente (OrderByDescending).
Antes de meternos en faena, decir que vamos a usar como fuente de datos un xml con información sobre países, el mismo que usamos en el post “Operadores de Linq: Como usar los operadores Take, StartsWith, EndsWith y Contains”. El xml tiene este aspecto:
<countries>
<country code="AF" iso="4">Afghanistan</country>
<country code="AL" iso="8">Albania</country>
<country code="DZ" iso="12">Algeria</country>
<country code="AS" iso="16">American Samoa</country>
<country code="AD" iso="20">Andorra</country>
<country code="AO" iso="24">Angola</country>
<country code="AI" iso="660">Anguilla</country>
<country code="AQ" iso="10">Antarctica</country>
<country code="AG" iso="28">Antigua And Barbuda</country>
<country code="AR" iso="32">Argentina</country>
</countries>
Para tratar los datos, vamos a usar una entidad llamada CountryInfo y tiene este aspecto:
public class CountryInfo
{
public string Code { get; set; }
public int IsoCode { get; set; }
public string Name { get; set; }
}
El operador OrderBy.
El operador OrderBy nos va a permitir ordenar un conjunto de datos de forma ascendente. Este operador, tiene dos sobrecargas y las firmas son:
public static IOrderedSequence<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
public static IOrderedSequence<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IComparer<TKey> comparer)
Como podemos ver en las firmas, el operador OrderBy, nos permite implementar nuestra propia operación de comparación, haciendo así este operador todavía más efectivo dado que lo podremos adaptar todo lo que queramos a nuestras necesidades.
La sintaxis para aplicarlo, sería la siguiente:
getAllCountries().OrderBy(c => c.Name)
Hay que tener en cuenta que el método getAllCountries, nos devuelve un IEnumerable y para indicar el criterio de ordenación usamos una expresión lambda.
El operador OrderByDescending
El operador OrderByDescending nos va a permitir ordenar un conjunto de datos de forma descendiente. Este operador también tiene dos sobrecargas y las firmas son:
public static IOrderedSequence<TSource> OrderByDescending<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
public static IOrderedSequence<TSource> OrderByDescending<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IComparer<TKey> comparer)
Como se puede ver y al igual que el operador OrderBy, el operador OrderByDescending también nos permite usar nuestra propia operación de comparación.
La sintaxis de este operador es igual que la del operador OrderBy:
getAllCountries().OrderByDescending(c => c.Name)
Operaciones de ordenación personalizadas.
Como ya hemos dicho, ambos operadores nos permiten personalizar nuestras operaciones de ordenación, para ello, tendremos que crear una clase que implemente la interfaz IComparer.
Por ejemplo podría ser algo así:
public class CaseInsensitiveComparer : IComparer<string>
{
public int Compare(string x, string y)
{
return string.Compare(x, y, true);
}
}
Post relacionados.
Descargas – Downloads.
Mientras he escrito este post, he estado escuchando a Sneaky Sound System, así que yo me voy que tengo una cita y aqui os dejo con ellos.
Muchas gracias! Espero que hayas tenido suerte en tu cita!
Tu ejemplo es muy complejo para mi nivel actual.
No te pido que me resuelvas el problema, pero por favor me podrías indicar qué tengo que leer o investigar para ordenar este XML por elemento ?
Desde ya gracias y felicitaciones!
30
Juan
26
Pedro
121
Manuel
Le cambié los signos mayor y menor porque los eliminó:
[Carrera]
[Arribo]
[Tiempo]3[/Tiempo]
[Corredor]Introduccion[/Corredor]
[/Arribo]
[Arribo]
[Tiempo]6[/Tiempo]
[Corredor][/Corredor]
[/Arribo]
[Arribo]
[Tiempo]12[/Tiempo]
[Corredor]Clasificacion[/Corredor]
[/Arribo]
[/Carrera]
Hola Martín,
En cuanto tenga un rato te lo reviso y te digo.
gracias y saludos.