1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【保険商品管理システムの開発】火災保険の見積もり計算を行うAPIコントローラーの解説(2)

Posted at

3. Calculate メソッドの流れ

1. 地域判定

Controllers/FireInsuranceController.cs
if (!_prefectureRegionMap.TryGetValue(request.Prefecture, out var region))
    return BadRequest("対象外の都道府県です。");

• 入力された都道府県から地域区分を取得
• 該当しない場合はエラー

1. TryGetValue とは

• TryGetValue は 辞書(Dictionary) でよく使うメソッドです。
• 役割:指定したキー(ここでは request.Prefecture)が存在するかを確認し、もしあれば対応する値を取得します。
• 戻り値は bool(キーが見つかったら true、なければ false)。

Controllers/FireInsuranceController.cs
bool found = dictionary.TryGetValue(key, out value);

• found が true → value に値が入る
• found が false → value には既定値(null や 0 など)が入る

2. out var region の意味

• out は「この変数はメソッドの中で値をセットするから、呼び出し元で使えるようにする」という修飾子です。
• var は「型推論」。region の型は _prefectureRegionMap の値の型から自動で決まります。
• つまり、

Controllers/FireInsuranceController.cs
out var region

は「region という変数をここで宣言し、TryGetValue が中で値を代入してくれる」という意味です。

3. 全体の動き

Controllers/FireInsuranceController.cs
if (!_prefectureRegionMap.TryGetValue(request.Prefecture, out var region))

「request.Prefecture というキーで _prefectureRegionMap から値を探す。
見つからなければ(! で否定)if の中の処理を実行する。
見つかった場合、その値は region という変数に格納される。」

4.例

var map = new Dictionary<string, string>
{
    { "東京", "関東" },
    { "大阪", "近畿" }
};

string prefecture = "東京";

if (!map.TryGetValue(prefecture, out var region))
{
    Console.WriteLine("見つかりませんでした");
}
else
{
    Console.WriteLine($"{prefecture}{region} にあります");
}

出力:

東京 は 関東 にあります

2. 料率取得

Controllers/FireInsuranceController.cs
var rate = _rateTable.FirstOrDefault(r => r.StructureType == request.StructureType && r.Region == region);
if (rate == null) return BadRequest("該当する料率が見つかりません。");

• 建物構造(木造・鉄筋)+地域(関東・関西)で料率を検索
• 見つからなければエラー

1. var rate

• var は「型推論」です。
右辺の式を見て、C# が自動的に rate の型を決めます。
もし _rateTable が List なら、rate の型は FireInsuranceRate になります。

2. _rateTable

• これはおそらく「火災保険の料率データ」を格納したリストや配列です。

        private readonly List<FireInsuranceRate> _rateTable = new()
        {
            new FireInsuranceRate { StructureType = "木造", Region = "関東", BaseRate = 0.0035m, AgeFactor = 1.10m, CoverageFactor = 1.00m },
            new FireInsuranceRate { StructureType = "木造", Region = "関西", BaseRate = 0.0030m, AgeFactor = 1.05m, CoverageFactor = 0.95m },
            new FireInsuranceRate { StructureType = "鉄筋", Region = "関東", BaseRate = 0.0020m, AgeFactor = 1.00m, CoverageFactor = 0.90m },
            new FireInsuranceRate { StructureType = "鉄筋", Region = "関西", BaseRate = 0.0018m, AgeFactor = 0.98m, CoverageFactor = 0.85m },
        };

3. .FirstOrDefault(...)

• LINQ のメソッドで、
• 条件に一致する 最初の要素 を返す
• 一致するものがなければ null(参照型)やデフォルト値(値型) を返す
• 「最初の一致」しか返さないため、複数の候補があっても最初の1つだけです。

4. (r => r.StructureType == request.StructureType && r.Region == region)

• これは ラムダ式 と呼ばれる「無名関数」です。
• r は _rateTable の1要素を表します(FireInsuranceRate 型のインスタンス)。
• 条件:
• r.StructureType == request.StructureType
⇒ 保険契約リクエストの構造種別と一致する
• r.Region == region
⇒ 地域コードが一致する
• && は「かつ」の意味です。

5. 処理の流れ

  1. _rateTable の中を先頭から順にチェック
  2. 各要素を r に入れて、条件式を評価
  3. 両方の条件を満たす最初の要素を rate に代入
  4. もし該当がなければ rate には null が入る

✅ まとめると、この1行は

_rateTable の中から、構造種別と地域が一致する最初の料率データを探し、それを rate に入れる(なければ null)。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?