3. Calculate メソッドの流れ
1. 地域判定
if (!_prefectureRegionMap.TryGetValue(request.Prefecture, out var region))
return BadRequest("対象外の都道府県です。");
• 入力された都道府県から地域区分を取得
• 該当しない場合はエラー
1. TryGetValue とは
• TryGetValue は 辞書(Dictionary) でよく使うメソッドです。
• 役割:指定したキー(ここでは request.Prefecture)が存在するかを確認し、もしあれば対応する値を取得します。
• 戻り値は bool(キーが見つかったら true、なければ false)。
bool found = dictionary.TryGetValue(key, out value);
• found が true → value に値が入る
• found が false → value には既定値(null や 0 など)が入る
2. out var region の意味
• out は「この変数はメソッドの中で値をセットするから、呼び出し元で使えるようにする」という修飾子です。
• var は「型推論」。region の型は _prefectureRegionMap の値の型から自動で決まります。
• つまり、
out var region
は「region という変数をここで宣言し、TryGetValue が中で値を代入してくれる」という意味です。
3. 全体の動き
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. 料率取得
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. 処理の流れ
- _rateTable の中を先頭から順にチェック
- 各要素を r に入れて、条件式を評価
- 両方の条件を満たす最初の要素を rate に代入
- もし該当がなければ rate には null が入る
✅ まとめると、この1行は
_rateTable の中から、構造種別と地域が一致する最初の料率データを探し、それを rate に入れる(なければ null)。