Adiciones recientes a LINQ

“I have to admit it’s getting better
A little better all the time…”
The Beatles, “Getting Better” (1967)

“If I ever lose my faith in you
There’ll be nothing left for me to do…”
Sting, “If I Ever Lose My Faith in You” (1993)

Después de bastante tiempo (una década, para ser más exactos) sin mirar qué nuevos elementos se han incorporado a LINQ (la última vez que lo hice fue aquí), hoy me ha dado por abrir el Object Browser de Visual Studio 2019 y comparar los contenidos de System.Linq.dll para .NET 4.0 y 5.0. Esto no me habría pasado si hubiera seguido manteniendo al día mi libro «C# 3.0 y LINQ», como era mi intención original después que lo escribí. Pero seguro el lector ya sabe por experiencia propia lo malo que es perder la fe. Yo la he perdido en varias cosas (aunque no en la principal, recordando a Sting) a lo largo de mi(s) vida(s).

A continuación presento una pequeña lista con las cosas nuevas que encontré. Dejo para una (posible) próxima entrada un análisis de las diferencias en System.Linq.Expressions.dll. El siguiente es el código de ejemplo asociado:

01 using System; using System.Linq; 
02      
03 class Program
04 {
05     static void Main(string[] args)
06     {
07         int[] a = { 0, 1, 2, 3, 4, 5, 6,  7,  8,  9, 10 };
08         int[] b = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 };
09  
10         Console.WriteLine(string.Join(", ", a.Prepend(-1).Append(11)));
11
12         Console.WriteLine(string.Join(", ", b.TakeLast(10).SkipLast(5)));
13
14         Console.WriteLine(string.Join(", ", Enumerable.Zip(a, b, (x, y) => x * y)));
15         Console.WriteLine(string.Join(", ", Enumerable.Zip(a, b)));
16         Console.WriteLine(Enumerable.Zip(a, b).First().GetType().FullName);
17     }
18 }

La salida que el programa produce es la siguiente:

-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
1, 2, 3, 5, 8
0, 1, 2, 6, 12, 25, 48, 91, 168, 306, 550
(0, 0), (1, 1), (2, 1), (3, 2), (4, 3), (5, 5), (6, 8), (7, 13), (8, 21), (9, 34), (10, 55)
System.ValueTuple`2[
  [System.Int32, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],
  [System.Int32, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]

1. Prepend y Append

Prepend y Append permiten añadir un elemento al principio o al final de una secuencia, respectivamente, como se desprende del ejemplo. Nada que no se pueda hacer con una o dos líneas de código; pero además de ahorrarnos algunos golpes de teclas, esta incorporación pone a esas funciones en el lugar al que pertenecen por derecho propio.

2. TakeLast y SkipLast

TakeLast y SkipLast son variantes de Take y Skip que toman o descartan elementos del final de una secuencia.

3. Zip sin la función de combinación

Ésta es realmente la única novedad por la que tal vez haya valido la pena haber escrito este post. Precisamente en la entrada a la que hacía referencia antes daba cuenta de la aparición de una nueva función LINQ, Zip, que produce una secuencia aplicando una función de combinación a los elementos correspondientes de otras dos secuencias. Por ejemplo, en la línea 14 del código de ejemplo se utiliza esta versión de Zip para producir la secuencia resultante de la multiplicación de los elementos correspondientes de a y b. Dado que en C# 7.0 se incorporaron al lenguaje las tuplas por valor (value tuples), cobra sentido que se haya añadido más recientemente a LINQ una nueva sobrecarga de Zip que produce una secuencia de tuplas con los elementos correspondientes de las secuencias de entrada. La línea 15 del código muestra un ejemplo, y la línea 16 permite comprobar que el tipo de los elementos de la secuencia es, como cabría esperar, System.ValueTuple.

奥克塔维奥


Referencias musicales:

  • Es prácticamente imposible decir algo sobre The Beatles que no haya sido dicho ya. Solo sé que me siento muy afortunado de haber recibido su influencia en mi temprana juventud. «Getting Better» forma parte de ese disco legendario que es «Sgt. Pepper’s Lonely Hearts Club Band» (1967).
  • Aunque siempre me gustó mucho, y especialmente desde que empezó su periplo en solitario, Sting se convirtió en mi principal referencia musical durante mi vida europea, que empezó en 1992. Precisamente en 1993 Sting publicó el que probablemente es su mejor disco, «Ten Summoner’s Tales«, que contiene «If I Ever Lose My Faith in You», además de otros éxitos como «Fields of Gold», «It’s Probably Me» y «Shape of my Heart».

Octavio Hernandez

Desarrollador y consultor en tecnologías .NET. Microsoft C# MVP entre 2004 y 2010.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *