###LINQをList<コレクションクラス>にどう書くか?
LINQの記事では、string型やint型のListを扱っているものはよくある。しかし、独自で作成したコレクションクラスのListをどうLINQで処理するかの記事が発見しづらかった。そのため、ここにその仕方を記述する。
元となるList<独自クラスで複数のフィールドを持つ>の値で、同一科目のものは集約しつつ、金額は合計値を記述するようなテキスト(メモ)を生成したい。
public string WritingMemo( List<JournalizingMemo> MemoDrafts)
{
//メモの元MemoDraftsから同一会計名目や貸借項目は集約し金額は合計値を記述したいので
var memoArranged = MemoDrafts.GroupBy(x => new { x.SlipDate, x.AccountingName,x.BalanceName, x.SubjectName })
.Select(y => new
{
SlipDate = y.Key.SlipDate,
Amount = y.Sum(z => z.Amount),
AccountingName = y.Key.AccountingName,
BalanceName = y.Key.BalanceName,
SubjectName = y.Key.SubjectName
})
.OrderBy(x => x.SlipDate)
.ThenBy(x => x.AccountingName)
.ThenBy(x => x.BalanceName)
.ThenBy(x => x.SubjectName);
//メモのヘッダー作成
sb.AppendLine("出力日:" + DateTime.Now.Date.ToString("yyyy/mm/dd"));
sb.AppendLine("");
//集約結果からテキストに起こす
var sb = new StringBuilder();
foreach (var record in memoArranged)
{
sb.AppendLine("伝票日付:" + record.SlipDate.ToString("yyyy/mm/dd"));
sb.AppendLine($"口座情報:{record.AccountingName}");
//...中略
}
return sb.ToString();
という書き方で、独自のコレクションクラスに対しても、LINQを用いれば簡単に集約した結果を記述できる。