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:
- Filtra i dipendenti di età superiore ai 25 anni
- Li ordina per nome
- Prende i primi 10 risultati
- Seleziona solo i loro nomi
migliori pratiche
- Utilizzare i predicati in modo efficiente - Filtrare i dati il prima possibile nella catena
- Evitare espressioni complesse - Scomporre la logica complessa in più passaggi
- Test con dati di esempio - Verifica che i metodi di enumerazione funzionino con la tua struttura dati
- Gestire le collezioni vuote - Utilizzo
Any()per verificare prima di elaborare le raccolte - 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.
:::