初投稿です。
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);
}
}