0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

コレクションクラスのListに対してLINQを用いて集約したい。GroupBY,Sum,OrderBy,Selectの書き方

Last updated at Posted at 2020-05-16

###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を用いれば簡単に集約した結果を記述できる。

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?