跳到主要内容

模板中的枚举 - 数据方法指南

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)]>>

这个表达:

  1. 筛选25岁以上的员工
  2. 按名称排序
  3. 取前 10 个结果
  4. 仅选择他们的名字

最佳实践

  1. 高效使用谓词 - 在数据链的早期阶段就进行数据过滤。
  2. 避免使用复杂表达方式。 将复杂的逻辑分解成多个步骤
  3. 使用样本数据进行测试 - 验证枚举方法是否适用于你的数据结构
  4. 处理空集合 - 使用 Any() 处理收款前需进行检查
  5. 优化性能 - 尽量减少循环中枚举方法的调用

:::性能提示

处理大型数据集时,为了获得更好的性能,请考虑在数据源处(而不是在模板中)进行数据过滤和限制。

:::