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.

:::