Passa al contenuto principale

Enumerazione nei modelli - Guida ai metodi di dati

PDF4meIl motore di generazione di documenti di fornisce potenti metodi di enumerazione per manipolare le raccolte di dati all'interno dei modelli. Questi metodi, simili a C# IEnumerableOffrono un controllo completo sulle operazioni sui dati, tra cui ordinamento, filtraggio, aggregazione e trasformazione.


Metodi di enumerazione disponibili

I seguenti metodi possono essere applicati alle raccolte all'interno dei modelli per elaborare e manipolare i dati in modo dinamico:

Metodi di filtraggio e validazione

All(Predicate) - Determina se tutti gli elementi soddisfano una condizione

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

Any() - Determina se una collezione contiene elementi

employees.Any()

Any(Predicate) - Determina se un elemento soddisfa una condizione

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

Contains(Object) - Determina se una collezione contiene un elemento specifico

employees.Contains(otherPersons.First())

Metodi di aggregazione

Average(Selector) - Calcola la media di una raccolta numerica

employees.Average(p => p.Age)

Count() - Restituisce il numero di elementi in una collezione

employees.Count()

Count(Predicate) - Restituisce il numero di elementi che soddisfano una condizione

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

Max(ComparableSelector) - Restituisce il valore massimo in una collezione

employees.Max(p => p.Age)

Min(ComparableSelector) - Restituisce il valore minimo in una collezione

employees.Min(p => p.Age)

Sum(Selector) - Calcola la somma dei valori numerici in una raccolta

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

Metodi di selezione e proiezione

First() - Restituisce il primo elemento di una collezione

employees.First()

First(Predicate) - Restituisce il primo elemento che soddisfa una condizione

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

FirstOrDefault() - Restituisce il primo elemento, oppure un valore predefinito se vuoto

employees.FirstOrDefault()

FirstOrDefault(Predicate) - Restituisce il primo elemento che soddisfa una condizione, oppure il valore predefinito

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

Last() - Restituisce l'ultimo elemento di una collezione

employees.Last()

Last(Predicate) - Restituisce l'ultimo elemento che soddisfa una condizione

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

LastOrDefault() - Restituisce l'ultimo elemento, oppure un valore predefinito se vuoto

employees.LastOrDefault()

LastOrDefault(Predicate) - Restituisce l'ultimo elemento che soddisfa una condizione, oppure il valore predefinito

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

Single() - Restituisce l'unico elemento di una collezione

employees.Single()

Single(Predicate) - Restituisce l'unico elemento che soddisfa una condizione

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

SingleOrDefault() - Restituisce l'unico elemento, oppure un valore predefinito se vuoto

employees.SingleOrDefault()

SingleOrDefault(Predicate) - Restituisce l'unico elemento che soddisfa una condizione, oppure il valore predefinito

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

Metodi di ordinazione

OrderBy(ComparableSelector) - Ordina gli elementi in ordine crescente

employees.OrderBy(p => p.Age)

Può essere combinato con altri ordini:

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

OrderByDescending(ComparableSelector) - Ordina gli elementi in ordine decrescente

employees.OrderByDescending(p => p.Age)

Può essere combinato con altri ordini:

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

Operazioni di raccolta

Concat(IEnumerable) - Concatena due collezioni

employees.Concat(otherPersons)

Distinct() - Restituisce elementi distinti da una collezione

employees.Distinct()

Union(IEnumerable) - Produce l'unione dell'insieme di due collezioni

employees.Union(otherPersons)

Where(Predicate) - Filtra gli elementi in base a una condizione

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

Impostare le operazioni

Skip(int) - Ignora un numero specificato di elementi

employees.Skip(10)

SkipWhile(Predicate) - Ignora gli elementi finché una condizione è vera

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

Take(int) - Restituisce un numero specificato di elementi

employees.Take(5)

TakeWhile(Predicate) - Restituisce gli elementi a condizione che una condizione sia vera

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

Metodi di trasformazione

Select(Selector) - Proietta ogni elemento in una nuova forma

employees.Select(p => p.Name)

SelectMany(EnumerationSelector) - Proietta e appiattisce le collezioni

employees.SelectMany(p => p.Children)

GroupBy(Selector) - Raggruppa gli elementi in base a una chiave specificata

employees.GroupBy(p => p.Age)

È possibile raggruppare in base a più proprietà:

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

Esempi pratici

Esempio 1: Filtraggio e conteggio

Modello:

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

Esempio 2: Visualizzazione condizionale

Modello:

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

Esempio 3: Liste ordinate

Modello:

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

Esempio 4: Dati raggruppati

Modello:

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

Concatenamento dei metodi

È possibile concatenare più metodi di enumerazione per eseguire operazioni complesse sui dati:

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

Questa espressione:

  1. Filtra i dipendenti di età superiore ai 25 anni
  2. Li ordina per nome
  3. Prende i primi 10 risultati
  4. Seleziona solo i loro nomi

migliori pratiche

  1. Utilizzare i predicati in modo efficiente - Filtrare i dati il prima possibile nella catena
  2. Evitare espressioni complesse - Scomporre la logica complessa in più passaggi
  3. Test con dati di esempio - Verifica che i metodi di enumerazione funzionino con la tua struttura dati
  4. Gestire le collezioni vuote - Utilizzo Any() per verificare prima di elaborare le raccolte
  5. Ottimizza le prestazioni - Ridurre al minimo le chiamate ai metodi di enumerazione nei cicli

:::Suggerimento per le prestazioni Quando si lavora con grandi raccolte di dati, per ottenere prestazioni migliori è consigliabile filtrare e limitare i dati alla fonte anziché nel modello.

:::