Mostrando entradas con la etiqueta LinQ. Mostrar todas las entradas
Mostrando entradas con la etiqueta LinQ. Mostrar todas las entradas

viernes, 9 de marzo de 2018

Aggregate, the true LinQ aggregator operator







Aggregate LinQ operator, is the most very important LinQ aggregator operator and we will be create all others aggregators operator with its help. 

Let’s go see it.












jueves, 12 de octubre de 2017

Let Keyword in LinQ




This article try to lern the let keyword in LinQ, speaking of readiable, encapsulating and performance concepts.















miércoles, 27 de septiembre de 2017

default(T)




The default keyword, is a key of generics comparation and has de default info of CLR types. 













sábado, 22 de abril de 2017

Linq Extended Joins







A extension method library with all joins of sql that not exists in LinQ.














Linq Extended Joins






Hace unos años leí un artículo de C. L. Moffatt (link), donde se explicaba de forma clara y concisa los diferentes tipos de joins en SQL, y tomé la idea de escribir un artículo similar pero enfocado a LinQ, ya que había visto en muchas ocasiones muchas preguntas en foros dirigidas a este tema, pero no he encontrado ninguna en la que aune todos y cada uno de los casos.

Espero dar algo de luz con las líneas que siguen.




jueves, 17 de noviembre de 2016

Generic IEqualityComparer -E-





Powerful generic class for a generic abstraction of IEqualityComparer.














domingo, 6 de noviembre de 2016

Extendiendo LinQ




Como hemos mencionado en otros posts y en otras ocasiones, la librería principal de LinQ, System.Linq, está formada por un conjunto de métodos extensores que en la mayoría de los casos expande la funcionalidad del tipo IEnumerable<T>. Por este motivo, y por facilidad de generación de este tipo de métodos, alargar, dilatar, mejorar o incluso moldear muchos de ellos, se vuelve una tarea muy simple y en ocasiones bastante gratificante y útil.

 Os indico como recordatorio los enlaces para métodos extensores y generics, que son básicos para dominar el tema de hoy.



domingo, 30 de octubre de 2016

PLinQ 2



En este nuevo post de PLinQ, nos vamos a centrar en los métodos más importantes de ParalallelEnumerable, decimos los más importantes, ya que nos ofrecen una funcionalidad extra para nuestras consultas parametrizadas.

Cabe destacar, como nombramos en el anterior post de PLinQ, que la clase ParallelEnumerable, tiene una definición para cada uno de los métodos extensores (operadores de consulta) de la clase System.LinQ, para hacer completamente transparente su uso, de modo que pensemos que estamos utilizando una consulta simple a un IEnumerable.





sábado, 22 de octubre de 2016

PlinQ 1



A forma de introducción, PLinQ, ofrece la capacidad de realizar consultas LinQ To Objects, de forma paralela, ósea utilizando todos los cores (núcleos) de el microprocesador. En un primer vistazo, podemos pensar que esto es magia, pero como veremos a continuación, no es algo que sea 100% recomendable en todos los casos, y puede llegar a tener una serie de consideraciones y fallos, que o bien no conocemos o no estamos acostumbrados en la programación síncrona.

Una de las ideas que solemos tener en nuestra cabeza acerca de la programación en paralelo, es que si poseemos una máquina con 4 cores o microprocesadores, un trabajo que tarda en hacerse 20 segundos, debería de tardar 20/4, solo 5 segundos. Esto no es cierto, hay algunos casos en que la ejecución sobre un único núcleo es más rápida que sobre n. La diferencia radica, en que para poder hacer una ejecución en paralelo es necesario particionar la información en trozos, para que cada uno de estos, sea tratado por un núcleo y luego volver a fusionar la información. Todo este trabajo, conlleva un sobrecoste, que en ocasiones no es conveniente.

lunes, 16 de mayo de 2016

Let




Una entrada que pudiera ser no merecedora de un espacio para ella sola. La cláusula Let, tiene una serie de virtudes que van desde una mejora notable en la lectura y comprensión del código, hasta un incremento en el rendimiento por la reducción de llamadas redundantes.


La única nota negativa, pero no menos importante, es que esta cláusula, solo puede utilizarse con sintaxis de consulta (azúcar sintáctico), por lo que nuestras queridas Lambdas se quedan fuera.






domingo, 8 de mayo de 2016

Operadores de Conversión






Como su propio nombre indica, los operadores de conversión realizan transformaciones de datos de un tipo de colecciones a otras.


En este caso tenemos un grupo de operadores de conversión que son de ejecución instantánea, compuesta por los operadores ToList, ToArray, ToLookUp y ToDictionary, y otro grupo de carga perezosa o diferida, compuesta por OffType y Cast. De este último tipo también sería el operador AsEnumerable, pero en éste no pondremos mucho énfasis, ya que es un operador que se utiliza más en LinqToSql o LinqToEntities, y este curso es de LinqToObjects.





domingo, 1 de mayo de 2016

Operadores de Ordenación


Llegamos al grupo de operadores destinados a realizar el trabajo de ordenación en nuestras colecciones. Dentro de este apartado nos encontramos con un nuevo actor de este teatro, un actor que tiene una importancia mínima pero que forma parte de todo este tinglao, es la interfaz IOrderedEnumerable<TElement> . Es una interfaz super simple, que hereda de IEnumerable<TElement>  y de IEnumerable, y que simplemente añade un método CreateOrderedEnumerable, cuya función será la de crear las ordenaciones. Es importante nombrarla ya que será el tipo de devolución que generen nuestros operadores de ordenación OrderBy, OrderByDescending, ThenBy y ThenByDescending.

Llegados a este momento del repaso de LinQ, volveremos a ver las diferencias para estos operadores entre la sintaxis de consultas y nuestras queridas Lambdas.




martes, 19 de abril de 2016

Operadores de Agregación



Los Aggregate Operators, nos permiten realizar operaciones matemáticas de una temática simple sobre los elementos que forman una colección. Normalmente el resultado de estos, es un valor numérico, aunque no siempre es obligatorio.
La ejecución de todos estos operadores es inmediata, y se realiza justo en el momento de realizar la llamada, por lo que ninguno de ellos tiene ejecución diferida o perezosa.

En este conjunto de operadores, se diferencian tres tipos. Un primer tipo muy simple, compuesto por Count y LongCount. Un segundo grupo también bastante sencillo compuesto por Max, Min, Sum y Average y un tercero compuesto por el operador Aggregate, más complejo y potente. El primer grupo, posee sobrecargas sin parámetros, para secuencias numéricas sencillas y sobrecargas con filtrado (parámetro Func<T, bool>), que purifican la secuencia antes de aplicar el cálculo. Los métodos correspondientes al segundo grupo, poseen un número bastante considerable de sobrecargas, que van en concordancia con el tipo de datos sobre el que se aplica el cálculo, normalmente int, int?, double, doublé?, decimal, decimal?, long y long? En afinidad con su delegado genérico Func<T, int>, Func<T, int?>, Func<T, double>

lunes, 15 de junio de 2015

Set Operators, Concat, Union, Intersect, Except y Distinct




Seguimos con los operadores de LinQ, ahora le toca el turno a los ‘Set Operators’ u Operadores de Conjunto.

Los operadores de conjunto, nos permiten realizar actuaciones sobre dos secuencias (IEnumerable<T>) del mismo tipo de datos, dando como resultado una colección de este mismo tipo. Todas y cada una de sus ejecuciones se realizan de forma diferida o perezosa.

En caso de que alguna de estas colecciones sea null en el momento de realizar la llamada, el compilador lanzará un ArgumentNullException.

Vamos a detallar cada uno de sus operadores, para intentar que todo esto quede un poco más claro, haré un par de ejemplos para cada operador, uno con datos simples, colecciones de tipo int, y otro con una de las clases más utilizada en nuestros ejemplos y que tiene su definición en los post anteriores, el tipo Automovil. El objetivo  es comprender lo imprescindible, que es el uso de las sobrecargas que admiten un comparador de tipo IEQualityComparer<T> para los tipos compuestos, en el que indicaremos al compilador como queremos que se diferencien 2 objetos de este tipo.


Como en todas las reglas, hay una excepción y esta no iba a ser menos. El operador Distinct, cambiará, para utilizar una única colección en decremento de dos, pero eso lo contaremos un poquito más adelante.



domingo, 24 de mayo de 2015

Operadores de Elemento, First, Single, LastOrDefault ... etc.




Los operadores de elemento son todos aquellos métodos extensores dentro de la librería de LinQ, que devuelven una única pieza o el valor por defecto de su tipo a partir de una secuencia de datos IEnumerable<TSource>.


Estos operadores suelen estar compuestos por su definición simple y una variación ‘OrDefault’. Esta variación ‘OrDefault’, viene a significar, que en caso de no cumplirse el criterio de búsqueda, el operador no lanzará ninguna excepción y devolverá el valor por defecto del tipo al que pertenece la secuencia. Este valor por defecto es el que devolvería el operador default(T), que ya estudiamos con anterioridad.









domingo, 10 de mayo de 2015

Paginación con LinQ



Después del último post dedicado a los operadores de Partición, me ha parecido interesante el parar un poco con toda la ristra de descripción de operadores y entrar un poco en un ejemplo más jugoso de la vida real. En este ejemplo utilizaremos dos de los operadores descritos en el último post, Take y Skip, y veremos lo enormemente sencillo que puede llegar a ser, el realizar paginación de datos con el uso de estos operadores.


Para el ejemplo he utilizado una aplicación WPF. No entraré demasiado en su implementación y en las características de esta tecnología, para aparte de no confundir, centrarme en lo realmente significativo del post. Pero que nadie se preocupe si está interesado en la última tecnología de desarrollo de aplicaciones de escritorio de Microsoft, ya que si el tiempo y la dedicación me lo permiten, cuando acabe todo este tinglao de LinQ, la idea es empezar con WPF, ya que creo que el vacío de información en castellano es bastante grande, y no hay nada realmente didáctico.




miércoles, 6 de mayo de 2015

Partitions Operators, Take, Skip, TakeWhile y SkipWhile






El objetivo de los operadores de partición, consiste en restringir el número de elementos de una secuencia. Para ello creará 2 subsecuencias en memoria, en base a un parámetro int o un Func<T, bool>, según el tipo de operador. Una de estas dos subsecuencias, serán el resultado, y la elección, también se tendrá en cuenta según el operador utilizado. Para vislumbrar mejor estas líneas, vamos a ver cada uno de ellos con más detalle:






lunes, 20 de abril de 2015

Quantifiers Operators, All, Any y Contains







Los Quantifier Operators, son un grupo bastante especial de métodos extensores que devuelven un objeto de tipo bool.

 Este tipo de métodos son en ocasiones obviados, normalmente por su desconocimiento y sustituidos por la unión del uso del método Where() + Count().

Este suele ser un error común de uso, ya que los Quantifier Operators están optimizados para este fin, y la ganancia de rendimiento con su uso es más que evidente.

Más adelante haremos hincapié en ello con unos ejemplos que expongan este manifiesto.



sábado, 11 de abril de 2015

Joins




Los sistemas de bases de datos relacionales tradicionales, tienen la habilidad de poder fundir múltiples conjuntos de datos (normalmente tablas) dentro del resultado de una consulta. Para realizar estas uniones, se tienen en cuenta los datos en común entre unos y otros conjuntos, realizándose generalmente entre claves primarias y claves ajenas (PK y FK).

 Si nos ceñimos al caso de LinQ y al trabajo con datos en memoria mediante la programación orientada a objetos (OOP), el uso de joins en sí, es mucho menos frecuente, pero para quien se sienta cómodo con este tipo de acciones, Microsoft nos proporciona el operador Join, dentro de su conjunto de métodos extensores.


También abordaremos el caso del operador GroupJoin, que nos ofrece la capacidad de relacionar 2 conjuntos de datos, con una tipología mucho más cercana al programador, creando propiedades de tipo colección dentro de las propiedades de la secuencia de resultado, eliminando de esta manera los campos con datos redundantes.




martes, 24 de marzo de 2015

La claúsula GroupBy




Continuamos avanzando dentro de los operadores de consulta de LinQ, y ahora le toca el turno a Group By. Group By es otro de los operadores de consulta de proyección, que a grandes rasgos, nos permite desde una colección de entrada, devolver una colección de salida agrupada, mediante un sencillo grupo de claves valor. Donde la clave estará compuesta por los campos por los que hemos agrupados (los que forman el group by) y el valor lo formarán una colección de elementos que comparten los mismos valores para las propiedades que forman la clave.