模板中的枚举 - 数据方法指南
PDF4me的文档生成引擎提供了强大的枚举方法,用于操作模板中的数据集合。这些方法类似于 C# IEnumerable提供对数据操作的全面控制,包括排序、筛选、聚合和转换。
可用的枚举方法
以下方法可应用于模板中的集合,以动态处理和操作数据:
过滤和验证方法
All(Predicate) - 判断所有元素是否满足某个条件
[employees.All(p => p.Age < 50)]
Any() - 确定集合是否包含任何元素
employees.Any()
Any(Predicate) - 判断任何元素是否满足某个条件
employees.Any(p => p.Name == "Mary Doe")
Contains(Object) - 确定集合中是否包含特定元素
employees.Contains(otherPersons.First())
聚合方法
Average(Selector) 计算数值集合的平均值
employees.Average(p => p.Age)
Count() 返回集合中元素的数量
employees.Count()
Count(Predicate) 返回满足条件的元素数量
employees.Count(p => p.Age > 30)
Max(ComparableSelector) 返回集合中的最大值
employees.Max(p => p.Age)
Min(ComparableSelector) 返回集合中的最小值
employees.Min(p => p.Age)
Sum(Selector) 计算集合中数值的总和
employees.Sum(p => p.Children.Count())
选择和投影方法
First() 返回集合的第一个元素
employees.First()
First(Predicate) 返回满足条件的第一个元素
employees.First(p => p.Age > 30)
FirstOrDefault() 返回第一个元素,如果元素为空,则返回默认值。
employees.FirstOrDefault()
FirstOrDefault(Predicate) - 返回满足条件的第一个元素,或默认值
employees.FirstOrDefault(p => p.Age > 30)
Last() 返回集合的最后一个元素
employees.Last()
Last(Predicate) 返回满足条件的最后一个元素
employees.Last(p => p.Age > 100)
LastOrDefault() 返回最后一个元素,如果元素为空,则返回默认值。
employees.LastOrDefault()
LastOrDefault(Predicate) - 返回满足条件的最后一个元素,或默认值
employees.LastOrDefault(p => p.Age > 100)
Single() 返回集合中的唯一元素
employees.Single()
Single(Predicate) 返回满足条件的唯一元素
employees.Single(p => p.Name == "John Smith")
SingleOrDefault() - 返回唯一元素,如果元素为空,则返回默认值。
employees.SingleOrDefault()
SingleOrDefault(Predicate) - 返回满足条件的唯一元素,或默认值
employees.SingleOrDefault(p => p.Name == "Mary Doe")
订购方式
OrderBy(ComparableSelector) - 按升序对元素进行排序
employees.OrderBy(p => p.Age)
可以与其他订单串联:
employees.OrderBy(p => p.Age).ThenByDescending(p => p.Name)
OrderByDescending(ComparableSelector) - 按降序排列元素
employees.OrderByDescending(p => p.Age)
可以与其他订单串联:
employees.OrderByDescending(p => p.Age).ThenByDescending(p => p.Name)
收款操作
Concat(IEnumerable) - 连接两个集合
employees.Concat(otherPersons)
Distinct() 返回集合中的不同元素
employees.Distinct()
Union(IEnumerable) - 生成两个集合的并集
employees.Union(otherPersons)
Where(Predicate) - 根据条件筛选元素
employees.Where(p => p.Age > 18)
集合运算
Skip(int) - 跳过指定数量的元素
employees.Skip(10)
SkipWhile(Predicate) 只要条件为真,就跳过某些元素。
employees.SkipWhile(p => p.Age < 35)
Take(int) 返回指定数量的元素
employees.Take(5)
TakeWhile(Predicate) - 当条件为真时,返回元素
employees.TakeWhile(p => p.Age < 50)
转换方法
Select(Selector) 将每个元素投影成一种新形式
employees.Select(p => p.Name)
SelectMany(EnumerationSelector) - 项目和扁平化集合
employees.SelectMany(p => p.Children)
GroupBy(Selector) - 按指定键对元素进行分组
employees.GroupBy(p => p.Age)
可以按多个属性分组:
employees.GroupBy(p => new { Age = p.Age, Count = p.Children.Count() })
实际案例
示例 1:过滤和计数
模板:
Total employees over 30: <<[employees.Count(p => p.Age > 30)]>>
Average age: <<[employees.Average(p => p.Age)]>>
示例 2:条件显示
模板:
<<if [employees.Any(p => p.Age > 50)]>>
We have senior employees in the team.
<</if>>
示例 3:已排序列表
模板:
<<foreach [emp in employees.OrderBy(p => p.Name)]>>
- <<[emp.Name]>> (Age: <<[emp.Age]>>)
<</foreach>>
示例 4:分组数据
模板:
<<foreach [group in employees.GroupBy(p => p.Department)]>>
Department: <<[group.Key]>>
Employee Count: <<[group.Count()]>>
<</foreach>>
方法链
可以将多个枚举方法串联起来,用于执行复杂的数据操作:
<<[employees
.Where(p => p.Age > 25)
.OrderBy(p => p.Name)
.Take(10)
.Select(p => p.Name)]>>
这个表达:
- 筛选25岁以上的员工
- 按名称排序
- 取前 10 个结果
- 仅选择他们的名字
最佳实践
- 高效使用谓词 - 在数据链的早期阶段就进行数据过滤。
- 避免使用复杂表达方式。 将复杂的逻辑分解成多个步骤
- 使用样本数据进行测试 - 验证枚举方法是否适用于你的数据结构
- 处理空集合 - 使用
Any()处理收款前需进行检查 - 优化性能 - 尽量减少循环中枚举方法的调用
:::性能提示
处理大型数据集时,为了获得更好的性能,请考虑在数据源处(而不是在模板中)进行数据过滤和限制。
:::