Énumération dans les modèles - Guide des méthodes de données
PDF4meLe moteur de génération de documents de offre des méthodes d'énumération puissantes pour manipuler les collections de données au sein de modèles. Ces méthodes, similaires à C# IEnumerable, offrent un contrôle complet des opérations sur les données, notamment le tri, le filtrage, l'agrégation et la transformation.
Méthodes d'énumération disponibles
Les méthodes suivantes peuvent être appliquées aux collections de vos modèles pour traiter et manipuler les données de manière dynamique :
Méthodes de filtrage et de validation
All(Predicate) - Détermine si tous les éléments satisfont à une condition
[employees.All(p => p.Age < 50)]
Any() - Détermine si une collection contient des éléments
employees.Any()
Any(Predicate) - Détermine si un élément quelconque satisfait une condition
employees.Any(p => p.Name == "Mary Doe")
Contains(Object) - Détermine si une collection contient un élément spécifique
employees.Contains(otherPersons.First())
Méthodes d'agrégation
Average(Selector) - Calcule la moyenne d'une collection numérique
employees.Average(p => p.Age)
Count() - Renvoie le nombre d'éléments dans une collection
employees.Count()
Count(Predicate) - Renvoie le nombre d'éléments qui satisfont une condition
employees.Count(p => p.Age > 30)
Max(ComparableSelector) - Renvoie la valeur maximale d'une collection
employees.Max(p => p.Age)
Min(ComparableSelector) - Renvoie la valeur minimale d'une collection
employees.Min(p => p.Age)
Sum(Selector) - Calcule la somme des valeurs numériques d'une collection
employees.Sum(p => p.Children.Count())
Méthodes de sélection et de projection
First() - Renvoie le premier élément d'une collection
employees.First()
First(Predicate) - Renvoie le premier élément qui satisfait une condition
employees.First(p => p.Age > 30)
FirstOrDefault() Renvoie le premier élément, ou une valeur par défaut si vide.
employees.FirstOrDefault()
FirstOrDefault(Predicate) - Renvoie le premier élément qui satisfait une condition, ou la valeur par défaut
employees.FirstOrDefault(p => p.Age > 30)
Last() - Renvoie le dernier élément d'une collection
employees.Last()
Last(Predicate) - Renvoie le dernier élément qui satisfait une condition
employees.Last(p => p.Age > 100)
LastOrDefault() Renvoie le dernier élément, ou une valeur par défaut si la liste est vide.
employees.LastOrDefault()
LastOrDefault(Predicate) - Renvoie le dernier élément qui satisfait une condition, ou la valeur par défaut
employees.LastOrDefault(p => p.Age > 100)
Single() - Renvoie le seul élément d'une collection
employees.Single()
Single(Predicate) - Renvoie le seul élément qui satisfait une condition
employees.Single(p => p.Name == "John Smith")
SingleOrDefault() Renvoie le seul élément, ou une valeur par défaut si l'élément est vide.
employees.SingleOrDefault()
SingleOrDefault(Predicate) - Renvoie le seul élément qui satisfait une condition, ou la valeur par défaut
employees.SingleOrDefault(p => p.Name == "Mary Doe")
Méthodes de commande
OrderBy(ComparableSelector) - Trie les éléments par ordre croissant
employees.OrderBy(p => p.Age)
Peut être combiné avec une commande supplémentaire :
employees.OrderBy(p => p.Age).ThenByDescending(p => p.Name)
OrderByDescending(ComparableSelector) - Trie les éléments par ordre décroissant
employees.OrderByDescending(p => p.Age)
Peut être combiné avec une commande supplémentaire :
employees.OrderByDescending(p => p.Age).ThenByDescending(p => p.Name)
Opérations de recouvrement
Concat(IEnumerable) - Concaténe deux collections
employees.Concat(otherPersons)
Distinct() - Renvoie les éléments distincts d'une collection
employees.Distinct()
Union(IEnumerable) - Produit l'union de deux collections
employees.Union(otherPersons)
Where(Predicate) - Filtre les éléments en fonction d'une condition
employees.Where(p => p.Age > 18)
Opérations d'ensemble
Skip(int) - Contourne un nombre spécifié d'éléments
employees.Skip(10)
SkipWhile(Predicate) - Contourne les éléments tant qu'une condition est vraie
employees.SkipWhile(p => p.Age < 35)
Take(int) - Renvoie un nombre spécifié d'éléments
employees.Take(5)
TakeWhile(Predicate) - Renvoie des éléments tant qu'une condition est vraie
employees.TakeWhile(p => p.Age < 50)
Méthodes de transformation
Select(Selector) - Projette chaque élément dans une nouvelle forme
employees.Select(p => p.Name)
SelectMany(EnumerationSelector) - Projets et aplatissement des collections
employees.SelectMany(p => p.Children)
GroupBy(Selector) - Groupe les éléments selon une clé spécifiée
employees.GroupBy(p => p.Age)
Possibilité de regrouper selon plusieurs propriétés :
employees.GroupBy(p => new { Age = p.Age, Count = p.Children.Count() })
Exemples pratiques
Exemple 1 : Filtrage et comptage
Modèle:
Total employees over 30: <<[employees.Count(p => p.Age > 30)]>>
Average age: <<[employees.Average(p => p.Age)]>>
Exemple 2 : Affichage conditionnel
Modèle:
<<if [employees.Any(p => p.Age > 50)]>>
We have senior employees in the team.
<</if>>
Exemple 3 : Listes triées
Modèle:
<<foreach [emp in employees.OrderBy(p => p.Name)]>>
- <<[emp.Name]>> (Age: <<[emp.Age]>>)
<</foreach>>
Exemple 4 : Données groupées
Modèle:
<<foreach [group in employees.GroupBy(p => p.Department)]>>
Department: <<[group.Key]>>
Employee Count: <<[group.Count()]>>
<</foreach>>
Enchaînement de méthodes
Plusieurs méthodes d'énumération peuvent être enchaînées pour des opérations de données complexes :
<<[employees
.Where(p => p.Age > 25)
.OrderBy(p => p.Name)
.Take(10)
.Select(p => p.Name)]>>
Cette expression :
- Filtre les employés de plus de 25 ans
- Les trie par nom
- Prend les 10 premiers résultats
- Sélectionne uniquement leurs noms
Meilleures pratiques
- Utilisez efficacement les prédicats - Filtrer les données le plus tôt possible dans la chaîne
- Évitez les expressions complexes - Décomposer une logique complexe en plusieurs étapes
- Test avec des données d'exemple - Vérifiez que les méthodes d'énumération fonctionnent avec votre structure de données
- Gérer les collections vides - Utiliser
Any()vérifier avant de traiter les collections - Optimiser les performances - Minimiser les appels de méthodes d'énumération dans les boucles
:::Considérations relatives aux performances
Lorsque vous travaillez avec de grands ensembles de données, envisagez de filtrer et de limiter les données à la source plutôt que dans le modèle pour de meilleures performances.
:::