記事詳細


投稿日
2026年11月15日10時52分
タイトル

今回は 複数の Payment をループで自動生成 できるようにし、TryGetValue の処理も共通化して簡潔にしています。

内容
using System;
using System.Collections.Generic;

public class Payment
{
    public int PaymentId { get; set; } // 自動生成される
    public DateTime Posted { get; set; }
    public bool InOut { get; set; }
    public int? SubjectNameId { get; set; }
    public string ItemName { get; set; }
    public string PaymentName { get; set; }
    public int? PaymentTypeId { get; set; }
    public int? PaymentMethodId { get; set; }
    public int? IncomeCategoryId { get; set; }
    public int? IncomeTypeId { get; set; }
    public decimal Amount { get; set; }
}

public class Program
{
    // 共通のTryGetValueラッパー(見つからなければnull)
    private static int? GetId(Dictionary<string, int> dict, string key)
    {
        return dict.TryGetValue(key, out var value) && value != 0 ? value : (int?)null;
    }

    public static void Main()
    {
        int thisYear = DateTime.Now.Year;
        int previousMonth = DateTime.Now.Month - 1;
        if (previousMonth == 0) { previousMonth = 12; thisYear--; }

        // 各Id辞書
        var subjectNameDict = new Dictionary<string, int> { { "家計", 1 }, { "事業", 2 } };
        var paymentTypeDict = new Dictionary<string, int> { { "予算", 10 }, { "支出", 20 } };
        var paymentMethodDict = new Dictionary<string, int> { { "現金", 100 }, { "銀行振込", 200 } };
        var incomeCategoryDict = new Dictionary<string, int> { { "給与", 300 }, { "副業", 400 } };
        var incomeTypeDict = new Dictionary<string, int> { { "定期", 500 }, { "臨時", 600 } };

        // 複数のPaymentデータ定義(キー名と金額)
        var paymentData = new[]
        {
            new { SubjectKey = "家計", TypeKey = "予算", MethodKey = "現金", CategoryKey = "給与", IncomeTypeKey = "定期", Amount = 268000m, ItemName = "今月予算" },
            new { SubjectKey = "事業", TypeKey = "支出", MethodKey = "銀行振込", CategoryKey = "副業", IncomeTypeKey = "臨時", Amount = 150000m, ItemName = "事業支出" }
        };

        var payments = new List<Payment>();

        foreach (var data in paymentData)
        {
            payments.Add(new Payment
            {
                Posted = new DateTime(thisYear, previousMonth, 1),
                InOut = true,
                SubjectNameId = GetId(subjectNameDict, data.SubjectKey),
                ItemName = data.ItemName,
                PaymentName = null,
                PaymentTypeId = GetId(paymentTypeDict, data.TypeKey),
                PaymentMethodId = GetId(paymentMethodDict, data.MethodKey),
                IncomeCategoryId = GetId(incomeCategoryDict, data.CategoryKey),
                IncomeTypeId = GetId(incomeTypeDict, data.IncomeTypeKey),
                Amount = data.Amount
            });
        }

        // 確認出力
        foreach (var p in payments)
        {
            Console.WriteLine($"Posted: {p.Posted:yyyy-MM-dd}, SubjectNameId: {p.SubjectNameId}, Amount: {p.Amount}");
        }
    }
}

改良点

  1. 共通化
    GetId メソッドで TryGetValue の処理を一元化し、見つからない場合は null を返す。

  2. ループ生成
    複数の Payment を匿名型配列 paymentData に定義し、ループで List<Payment> に追加。

  3. 可読性向上
    辞書キーと金額をまとめて管理できるため、コードが短くなり保守性が高い。

この形なら、辞書のキーや金額を追加するだけで新しい Payment を簡単に生成できます。
もし必要なら、この paymentData を外部設定ファイルやDBから読み込む形にもできます。

次はこのコードを ASP.NET Core MVC の Controller 内で使える形 に書き換えたバージョンも作れますが、それも提示しますか?
そうすれば実際のアプリに組み込みやすくなります。

Powered by Froala Editor

添付画像

画像はありません
Genreのカテゴリ-名
Contexts
編集 | 記事一覧