0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Enumで状態が最後まで行ったら最初の状態に戻す(繰り返し)の実装

Last updated at Posted at 2020-06-07

初投稿です。
C#を使って、音楽プレイヤーライクなものをつくっていました。
その中で、音楽をループさせない「NoLoop」・その一曲だけループさせる「FileLoop」・フォルダー内をループさせる「FolderLoop」の3つの状態が必要になり、ループボタン1つでモードが切り替えられるようにしたかったので、「状態が最後まで行ったら最初の状態に戻す」のを繰り返したく、以下を実装しました。
コードの説明は、まず各モードが書かれたEnumとそのEnumに対し「次の状態」と「前の状態」を取得できるような関数を書いたstaticなクラスを作ってます。

public class Test{
    public static void Main(){
        // Your code here!
        LoopStates loopState = LoopStates.NoLoop;
        System.Console.WriteLine(loopState);
        loopState = LoopStatesExtension.GetNextState(loopState);
        System.Console.WriteLine(loopState);
        loopState = LoopStatesExtension.GetNextState(loopState);
        System.Console.WriteLine(loopState);
        loopState = LoopStatesExtension.GetNextState(loopState);
        System.Console.WriteLine(loopState);    
        loopState = LoopStatesExtension.GetPreviousState(loopState);
        System.Console.WriteLine(loopState);    
    }
}

public enum LoopStates
{
    NoLoop,
    FileLoop,
    FolderLoop
}

mickey_devさんからもっとスマートなコードをいただいたので再編集します。
こっちのほうがif文使ってないのでスマートですね。

    public static class LoopStatesExtension
    {
        public static LoopStates GetNextState(LoopStates loopState)
        {
            int statesCount = System.Enum.GetValues(typeof(LoopStates)).Length;
            return (LoopStates)System.Enum.ToObject(typeof(LoopStates), ((int)loopState + 1) % statesCount);
        }

        public static LoopStates GetPreviousState(LoopStates loopState)
        {
            int statesCount = System.Enum.GetValues(typeof(LoopStates)).Length;
            // 負の数の剰余は求められないので loopState == 0 のために statesCount を加算しておく
            return (LoopStates)System.Enum.ToObject(typeof(LoopStates), ((int)loopState + statesCount - 1) % statesCount);
        }
    }

修正前は以下です。

public static class LoopStatesExtension
{ 
    public static LoopStates GetNextState(LoopStates loopState)
    {
        int MaxNumber = System.Enum.GetValues(typeof(LoopStates)).Length - 1;
        if ((int)loopState == MaxNumber)
            return (LoopStates)System.Enum.ToObject(typeof(LoopStates), 0);
        else
            return (LoopStates)System.Enum.ToObject(typeof(LoopStates),(int)loopState + 1);
    }
    public static LoopStates GetPreviousState(LoopStates loopState)
    {
        int MaxNumber = System.Enum.GetValues(typeof(LoopStates)).Length - 1;
        if ((int)loopState == 0)
            return (LoopStates)System.Enum.ToObject(typeof(LoopStates), MaxNumber);
        else
            return (LoopStates)System.Enum.ToObject(typeof(LoopStates),(int)loopState - 1);
    }
}

0
1
2

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?