Можно ли в C# у Enum переходить к следующему значению покругу?
Я решил написать шахматы. У меня есть поле move обозначающее чей сейчас ход.
public class Chess
{
ColorPiece move;
...
}
public enum ColorPiece
{
White,
Black
}
Я думал что можно просто инкрементом move++(ибо компилятор не жалуется) чтоб "переключать" но оказалось так он выходит за границы. Есть ли возможность это исправить?
P.S. знаю что можно по другому но интересно просто.
Ответы (3 шт):
Идея такая:
move ^= 1;
Но на C# это не скомпилируется - придётся добавить значение в сам енум:
public enum ColorPiece
{
White = 0,
Black = 1,
Xor = 1,
}
move ^= ColorPiece.Xor;
Добавляю отдельным значением, чтобы не было привязки к тому, кто там 0, а кто - 1.
Аккумулирую. Правильный ответ в случае если enum из двух элементов:
enum Enum
{
Start,
End
}
var e = Enum.Start;
e ^= Enum.End;
В случае если больше то нашёл только e = e == Enum.END ? Enum.START : e++;
Для частного случая типа
enum Power
{
On = 0,
Off = 1
}
Можно сделать просто
static Power Switch(Power value)
{
return value ^ Power.Off;
}
Проверяем
Power power = Power.On;
for (int i = 0; i < 10; i++)
{
Console.WriteLine(power);
power = Switch(power);
}
Вывод в консоль
On
Off
On
Off
On
Off
On
Off
On
Off
Для более общего случая, когда неизвестно количество элементов перечисления, их значения или даже тип перечисления, можно написать такой метод
static T Next<T>(T value) where T : struct, Enum
{
T[] values = Enum.GetValues<T>();
int index = (Array.IndexOf(values, value) + 1) % values.Length;
return values[index];
}
Проверяем
enum DayOfWeek
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
DayOfWeek dayOfWeek = DayOfWeek.Monday;
for (int i = 0; i < 10; i++)
{
Console.WriteLine(dayOfWeek);
dayOfWeek = Next(dayOfWeek);
}
Вывод в консоль
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
Monday
Tuesday
Wednesday