Я видел хорошее высокоуровневое обсуждение его на channel9 Mike Swanson в http://channel9.msdn.com/posts/Charles/Algorithms-and-Data-Structures-Mike-Swanson-Genetic-Session-Scheduler/
Нет, вы не можете безопасно привести к int []
. Типы перечислений не всегда используют int
в качестве базового значения. Если вы ограничиваете себя перечисляемыми типами, которые действительно имеют базовый тип int
, все должно быть в порядке.
Это похоже на то, что вы (или я) могли бы расширить ] Unconstrained Melody для поддержки, если вы хотите - таким образом, который действительно ограничивал тип как перечисляемый тип во время компиляции и работал для любого перечисляемого типа, даже тех, с базовыми базами, такими как long
и ulong
.
Без Unconstrained Melody вы все равно можете сделать это в общем случае, используя тот факт, что все типы перечислений эффективно реализуют IComparable
соответствующим образом. Если вы используете .NET 3.5, это как однострочный:
private static TEnum GetHighestValue<TEnum>() {
return Enum.GetValues(typeof(TEnum)).Cast<TEnum>().Max();
}
По совету Джона Скита (и спасибо вам, slugster), это обновленный код, теперь использующий IComparable, потому что я все еще нацелен на .NET 2.0.
/// <summary>Returns the highest value encountered in an enumeration</summary>
/// <typeparam name="EnumType">
/// Enumeration of which the highest value will be returned
/// </typeparam>
/// <returns>The highest value in the enumeration</returns>
private static EnumType highestValueInEnum<EnumType>() where EnumType : IComparable {
EnumType[] values = (EnumType[])Enum.GetValues(typeof(EnumType));
EnumType highestValue = values[0];
for(int index = 0; index < values.Length; ++index) {
if(values[index].CompareTo(highestValue) > 0) {
highestValue = values[index];
}
}
return highestValue;
}
Для тех, кто схватил кода, вы можете добавить дополнительную проверку, чтобы она не взрывалась при пустых перечислениях.
Легко! Используя LINQ, ваш цикл можно заменить двумя строками кода, или просто один, если вы хотите объединить все вместе.
public partial class Form1 : Form
{
private void Form1_Load(object sender, EventArgs e)
{
MyEnum z = MyEnum.Second;
z++;
z++;
//see if a specific value is defined in the enum:
bool isInTheEnum = !Enum.IsDefined(typeof(MyEnum), z);
//get the max value from the enum:
List<int> allValues = new List<int>(Enum.GetValues(typeof(MyEnum)).Cast<int>());
int maxValue = allValues.Max();
}
}
public enum MyEnum
{
Zero = 0,
First = 1,
Second = 2,
Third = 3
}