テンプレートにおける列挙 - データメソッドガイド
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) - 2つのコレクションを連結します
employees.Concat(otherPersons)
Distinct() - コレクションから重複のない要素を返します
employees.Distinct()
Union(IEnumerable) - 2つのコレクションの和集合を生成します
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()コレクションを処理する前に確認する - パフォーマンスを最適化する ループ内での列挙メソッドの呼び出しを最小限に抑える
:::ヒント:パフォーマンスに関する考慮事項 大規模なデータコレクションを扱う場合、パフォーマンス向上のため、テンプレートではなくデータソースでデータのフィルタリングや制限を行うことを検討してください。 :::