[Linq] Tomar e ignorar valores de un origen de datos

En ocasiones necesitamos mostrar solo una parte del resultado de una consulta Linq, algo así como lo haríamos con un Top de SQL, bien, pues esta no es una limitante para Linq pues entre unos de los tantos y tan sobrecargados métodos de Enumerable tenemos esta funcionalidad.

El método Take nos permite obtener los primeros n resultados de una lista de valores, por ejemplo:

string[] paises = { "Colombia", "Bolivia", "Argentina", "Venezuela", "Perú" };
var primeros3paises = paises.Take(3);
Console.WriteLine(“El top tres de paises latinoamericanos”);
foreach (var pais in primeros3paises)
{
                Console.WriteLine(pais);
}

El resultado de esta consulta nos arrojará una lista con los tres primeros tres países de nuestro origen de datos.

Por si fuera poco Enumerable tiene un método que nos permite ignorar los primeros n elementos en una lista de datos, este método es Skip, veamos un ejemplo:

string[] paises = { "Colombia", "Bolivia", "Argentina", "Venezuela", "Peru" };
var  ultimos2paises = paises.Skip(3);
Console.WriteLine(“Los dos últimos países de la lista son: “);
foreach (var pais in ultimos2paises)
{
                Console.WriteLine(pais);
}

El resultado de esta consulta nos arrojara una lista con los dos últimos países de la lista.

Bien, pero si ahora no supiéramos el numero de valores que necesitaremos seleccionar/ignorar y que éste, por el contrario, dependiera de una expresión? por fortuna para nosotros Enumerable tiene la respuesta, en este encontramos los métodos TakeWhile y SkipWhile, veamos un ejemplo:

int[] numeros = { 0,1,4,5,2,6,3,9,7,8 };
var primerosMenoresque5 = numeros.TakeWhile(n => n < 5);
Console.WriteLine(“Primeros números menores que 5:”);
foreach (var num in primerosMenoresque5 ) 
{
        Console.WriteLine(num);
}

El método TakeWhile nos retornará una lista con los valores mientras la condición marcada se cumpla, es decir, recorrerá cada uno de los ítems de la colección comparándolo con la expresión indicada, en el momento que sea false dejará de compararse con los demás valores de la colección. Teniendo esto claro el resultado de esa expresión será una colección con los valores 0,1,4.

El método SkipWhile funciona de una manera similar, solo que ignorará los valores que cumplan con la condición indicada, mientras el resultado de la comparación sea true. Teniendo esto claro el resultado de hacer un SkipWhile(n=> n < 5) a la lista de valores del ejemplo anterior nos daría: 5, 2, 6, 3, 9, 7, 8.

Espero les haya quedado claro el uso de estos útiles métodos, sino no duden en escribir un comentario con su duda para que sea aclarada.

Hasta el próximo post.

Anuncios
[Linq] Tomar e ignorar valores de un origen de datos

2 comentarios en “[Linq] Tomar e ignorar valores de un origen de datos

  1. Sigfrido dijo:

    Hola, me parece muy interesante. No obstante tengo una consulta al respecto: Comunmente hago esas exclusiones con un simple Where; en este sentido, cual es la diferencia con tajeWhile???

    1. Hola.

      Esa es una buena pregunta, pues bien la diferencia es simple, el TakeWhile te retornara los PRIMEROS N valores que cumplan con la condicion, es decir, una vez esta condicion se rompa no importa si los valores siguientes si cumplen con la condicion, se dejan de TOMAR valores. A diferencia de esto wl Where retornara TODOS LOS N VALORES que cumplan con la condicion.

      Un ejemplo muy claro sería:

      int[] numeros = { 0, 1, 4, 5, 2, 6, 3, 9, 7, 8 };
      List primerosMenoresque5 = numeros.TakeWhile(n => n < 5).ToList();
      List numerosMenoresque5 = numeros.Where(x => x < 5).ToList();

      Entonces podemos deducir que el conjunto de valores de la primera lista sera: 0, 1, 4 Puesto que son LOS PRIMEROS N valores que cumplen con la condicion. Y el conjunto de valores de la segunda lista sera: 0, 1, 4, 2, 3.

      Saludos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s