本文へスキップ
BecomeCoder

C# MVVMコース · 第2章 Entity ― 業務データの核 · レッスン7

Priority ― 優先度を列挙で表す

ブラウザで完結

導入

優先度のように「決まった選択肢の中から1つを選ぶ」種類の値は、TaskTitleほど複雑な検証ロジックを必要としないことが多く、C#の**enum**でシンプルに表現できます。enumは内部的に整数(既定はint)なので、宣言順を工夫すると比較演算子で大小関係も表現できます。

説明

flowchart LR
    L["Low = 0"] --> M["Medium = 1"] --> H["High = 2"]

サンプル

Rank r1 = Rank.Bronze;
Rank r2 = Rank.Gold;
Assert(r2 > r1, "宣言順が大小関係になる(Gold > Bronze)");
Console.WriteLine("全テスト成功");

enum Rank { Bronze, Silver, Gold }

void Assert(bool condition, string name)
{
    if (!condition) throw new Exception($"FAIL: {name}");
}
  • enumは宣言順に0, 1, 2, ...という整数値を持つ
  • 比較演算子(<, >, <=, >=)がそのまま使える。追加のクラスを作る必要はない
  • 選択肢が増減しても、呼び出し側のコードはswitchや比較演算子のままでよい

演習

契約どおりのPriorityLowMediumHigh)を使い、2つのうち優先度が高い方を返す関数をTDDで実装します。

Assert(Higher(Priority.Low, Priority.High) == Priority.High, "Highの方が優先度が高い");
Assert(Higher(Priority.Medium, Priority.Low) == Priority.Medium, "Mediumの方が優先度が高い");
Assert(Higher(Priority.Medium, Priority.Medium) == Priority.Medium, "同じなら同じ値でよい");
Console.WriteLine("全テスト成功");

enum Priority { Low, Medium, High }

// TODO: 2つのPriorityのうち高い方を返す Higher を実装してください(比較演算子が使えます)
void Assert(bool condition, string name)
{
    if (!condition) throw new Exception($"FAIL: {name}");
}
___
  • 期待される出力: 全テスト成功
ヒント1を見る

Priority Higher(Priority a, Priority b) => a > b ? a : b;

ヒント2を見る

enumは宣言順に整数値を持つので、Low < Medium < Highが成り立ちます

まとめ

  • 決まった選択肢から1つを選ぶ値はenumで十分なことが多い
  • enumは宣言順に整数値を持ち、比較演算子で大小を表現できる
  • Priority { Low, Medium, High }はこの後の章でもそのまま使い続ける

次回: TaskTitlePriorityを組み込んで、TaskItemを契約どおりの最終形にします。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。