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?

【C#】複数のbool型の変数値をひとつの変数で管理する方法【初心者向け】

Last updated at Posted at 2024-10-22

概要

bool型の変数が複数ある場合、それぞれの変数の値をひとつの変数で管理する方法について記載しました。

説明

例えばWPFのMVVMパターンの場合、下記のようにとある画面 (以下、サンプル画面と表記します) にトグルボタンが3つあり、

ViewModelに上記3つのボタンの押下状態を表すbool型のプロパティを持っているとします。

bool型のプロパティはそれぞれ、

  • isButtonASelected (ボタンAの押下状態)
  • isButtonBSelected (ボタンBの押下状態)
  • isButtonCSelected (ボタンCの押下状態)

という名前になっているとします。

上記のような場合で、各ボタンの押下状態をどこかに保存したい場合にそのまま保存しようとすると、A~Cボタンそれぞれの押下状態 (true もしくは false) を保存することになり、保存領域も各ボタンの数の分だけ用意しないといけません。
※例えばボタンが5つあったら5つのbool値を保存することになるので、5つの保存領域が必要です。

上記のような場合に、保存領域をひとつのみで完結できる (ボタンの押下状態をひとつの変数で管理する) 方法を記載します。

方法

まず以下のように、FlagsAttributeを付与したenumを定義します。

    [Flags]
    enum ButtonStatus
    {
        None = 0,
        ButtonASelected = 1,
        ButtonBSelected = 2,
        ButtonCSelected = 4
    }

enumにFlagsAttributeを定義すると、emumをビットフラグとして扱えるようになります。

※参考

上記のFlagsAttributeを定義したenumをもとに、今回はサンプル画面のボタンの押下状態を保存、復元してみます。

サンプル画面のボタンの押下状態を取得する

まずはサンプル画面の各ボタンの押下状態をひとつの変数に代入する方法です。

    var buttonStatus = ButtonStatus.None;
    if (isButtonASelected) buttonStatus |= ButtonStatus.ButtonASelected;
    if (isButtonBSelected) buttonStatus |= ButtonStatus.ButtonBSelected;
    if (isButtonCSelected) buttonStatus |= ButtonStatus.ButtonCSelected;

上記の形で、変数buttonStatusに各ボタンの押下状態をまとめた値が代入されます。
もちろん通常のEmumと同様、int型にも変換ができます。
このbuttonStatusの値をどこかに保存しておけば、いつでもサンプル画面のボタン押下状態を復元することができます。

保存しておいた値からトグルボタンの押下状態を復元する

サンプル画面のボタンの押下状態を取得するで変数buttonStatusにボタンの押下状態を代入しましたが、次はこの変数を使用して、押下状態を復元する方法です。

    // ボタンAの復元
    bool isButtonASelected = (buttonStatus & ButtonStatus.ButtonASelected) != 0;
    // ボタンBの復元
    bool isButtonBSelected = (buttonStatus & ButtonStatus.ButtonBSelected) != 0;
    // ボタンCの復元
    bool isButtonCSelected = (buttonStatus & ButtonStatus.ButtonCSelected) != 0;

上記のかたちでbuttonStatusの値をもとに、各bool型のプロパティにtrueもしくはfalseが格納されます。
上記コードの変数buttonStatusはenum型の想定ですが、通常のenumと同様に整数値からenum型にキャストすることもできます。なので保存していた値が整数値の場合は事前にenum型にキャストしてから、上記のコードのように行うと復元できます。

補足

最初に定義したenumですが、下記のように2進数で表現することもできます。
このようにすると見やすいかもしれません。
※例としてボタンがA~Fの6つある場合で記載しています。

    [Flags]
    enum ButtonStatus
    {
        None = 0b_000_000,
        ButtonASelected = 0b_000_001,
        ButtonBSelected = 0b_000_010,
        ButtonCSelected = 0b_000_100,
        ButtonDSelected = 0b_001_000,
        ButtonESelected = 0b_010_000,
        ButtonFSelected = 0b_100_000,
    }

二進数は先頭に0bをつけて表現します。
また_を付けて定位置で区切ると、視覚的にも見やすくなります。

終わりに

今回はトグルボタン3つの例でしたが、これがチェックボックス等、他のON、OFFを表現するコントロールの場合でも同じように対応できます。(当たり前ですが)
またボタンが4つ以上の場合も今回のパターンをベースに対応が可能です。

1
0
11

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?