Saltar al contenido principal

Enumeración en plantillas - Guía de métodos de datos

PDF4meEl motor de generación de documentos de proporciona métodos de enumeración potentes para manipular colecciones de datos dentro de las plantillas. Estos métodos, similares a C# IEnumerableOfrecen un control integral sobre las operaciones de datos, incluyendo la clasificación, el filtrado, la agregación y la transformación.


Métodos de enumeración disponibles​

Los siguientes métodos se pueden aplicar a las colecciones dentro de sus plantillas para procesar y manipular datos de forma dinámica:

Métodos de filtrado y validación​

All(Predicate) - Determina si todos los elementos cumplen una condición.

[employees.All(p => p.Age < 50)]

Any() - Determina si una colección contiene algún elemento

employees.Any()

Any(Predicate) - Determina si algún elemento satisface una condición.

employees.Any(p => p.Name == "Mary Doe")

Contains(Object) - Determina si una colección contiene un elemento específico.

employees.Contains(otherPersons.First())

Métodos de agregación​

Average(Selector) - Calcula el promedio de una colección numérica

employees.Average(p => p.Age)

Count() - Devuelve el número de elementos en una colección.

employees.Count()

Count(Predicate) - Devuelve el número de elementos que satisfacen una condición.

employees.Count(p => p.Age > 30)

Max(ComparableSelector) - Devuelve el valor máximo en una colección.

employees.Max(p => p.Age)

Min(ComparableSelector) - Devuelve el valor mínimo en una colección.

employees.Min(p => p.Age)

Sum(Selector) - Calcula la suma de los valores numéricos en una colección.

employees.Sum(p => p.Children.Count())

Métodos de selección y proyección​

First() - Devuelve el primer elemento de una colección.

employees.First()

First(Predicate) - Devuelve el primer elemento que satisface una condición.

employees.First(p => p.Age > 30)

FirstOrDefault() - Devuelve el primer elemento, o un valor predeterminado si está vacío.

employees.FirstOrDefault()

FirstOrDefault(Predicate) - Devuelve el primer elemento que satisface una condición o valor predeterminado.

employees.FirstOrDefault(p => p.Age > 30)

Last() - Devuelve el último elemento de una colección.

employees.Last()

Last(Predicate) - Devuelve el último elemento que satisface una condición.

employees.Last(p => p.Age > 100)

LastOrDefault() - Devuelve el último elemento, o un valor predeterminado si está vacío.

employees.LastOrDefault()

LastOrDefault(Predicate) - Devuelve el último elemento que satisface una condición o valor predeterminado.

employees.LastOrDefault(p => p.Age > 100)

Single() - Devuelve el único elemento de una colección.

employees.Single()

Single(Predicate) - Devuelve el único elemento que satisface una condición.

employees.Single(p => p.Name == "John Smith")

SingleOrDefault() - Devuelve el único elemento, o un valor predeterminado si está vacío.

employees.SingleOrDefault()

SingleOrDefault(Predicate) - Devuelve el único elemento que satisface una condición o un valor predeterminado.

employees.SingleOrDefault(p => p.Name == "Mary Doe")

Métodos de pedido​

OrderBy(ComparableSelector) - Ordena los elementos en orden ascendente

employees.OrderBy(p => p.Age)

Se puede encadenar con un ordenamiento adicional:

employees.OrderBy(p => p.Age).ThenByDescending(p => p.Name)

OrderByDescending(ComparableSelector) - Ordena los elementos en orden descendente

employees.OrderByDescending(p => p.Age)

Se puede encadenar con un ordenamiento adicional:

employees.OrderByDescending(p => p.Age).ThenByDescending(p => p.Name)

Operaciones de cobro​

Concat(IEnumerable) - Concatena dos colecciones

employees.Concat(otherPersons)

Distinct() - Devuelve elementos distintos de una colección.

employees.Distinct()

Union(IEnumerable) - Produce la unión de dos colecciones

employees.Union(otherPersons)

Where(Predicate) - Filtra elementos en función de una condición.

employees.Where(p => p.Age > 18)

Operaciones de conjunto​

Skip(int) - Omite un número específico de elementos.

employees.Skip(10)

SkipWhile(Predicate) - Omite elementos siempre que se cumpla una condición.

employees.SkipWhile(p => p.Age < 35)

Take(int) - Devuelve un número específico de elementos.

employees.Take(5)

TakeWhile(Predicate) - Devuelve elementos siempre que se cumpla una condición.

employees.TakeWhile(p => p.Age < 50)

Métodos de transformación​

Select(Selector) - Proyecta cada elemento en una nueva forma

employees.Select(p => p.Name)

SelectMany(EnumerationSelector) - Proyectos y colecciones aplanadas

employees.SelectMany(p => p.Children)

GroupBy(Selector) - Agrupa elementos por una clave específica.

employees.GroupBy(p => p.Age)

Se puede agrupar por múltiples propiedades:

employees.GroupBy(p => new { Age = p.Age, Count = p.Children.Count() })

Ejemplos prácticos​

Ejemplo 1: Filtrado y conteo​

Plantilla:

Total employees over 30: <<[employees.Count(p => p.Age > 30)]>>
Average age: <<[employees.Average(p => p.Age)]>>

Ejemplo 2: Visualización condicional​

Plantilla:

<<if [employees.Any(p => p.Age > 50)]>>
We have senior employees in the team.
<</if>>

Ejemplo 3: Listas ordenadas​

Plantilla:

<<foreach [emp in employees.OrderBy(p => p.Name)]>>
- <<[emp.Name]>> (Age: <<[emp.Age]>>)
<</foreach>>

Ejemplo 4: Datos agrupados​

Plantilla:

<<foreach [group in employees.GroupBy(p => p.Department)]>>
Department: <<[group.Key]>>
Employee Count: <<[group.Count()]>>
<</foreach>>

Encadenamiento de métodos​

Se pueden encadenar varios métodos de enumeración para realizar operaciones de datos complejas:

<<[employees
.Where(p => p.Age > 25)
.OrderBy(p => p.Name)
.Take(10)
.Select(p => p.Name)]>>

Esta expresión:

  1. Filtra a los empleados mayores de 25 años.
  2. Los ordena por nombre
  3. Toma los primeros 10 resultados
  4. Selecciona solo sus nombres

Mejores prácticas​

  1. Utilice los predicados de forma eficiente. - Filtrar los datos lo antes posible en la cadena.
  2. Evite expresiones complejas - Desglosar la lógica compleja en varios pasos.
  3. Prueba con datos de muestra - Verifica que los métodos de enumeración funcionen con tu estructura de datos.
  4. Gestionar colecciones vacías - Usar Any() verificar antes de procesar las colecciones
  5. Optimizar el rendimiento - Minimizar las llamadas a métodos de enumeración en bucles.

:::Consejo: Consideraciones sobre el rendimiento Al trabajar con grandes conjuntos de datos, considere filtrar y limitar los datos en la fuente en lugar de en la plantilla para obtener un mejor rendimiento.

:::