在枚举中找到最高价值

时间:2009-11-17 07:41:08

标签: c# arrays enums

我正在编写一个确定.NET枚举中最高值的方法,因此我可以为每个枚举值创建一个BitArray:

pressedKeys = new BitArray(highestValueInEnum<Keys>());

我需要两个不同的枚举,所以我把它变成了一个通用的方法:

/// <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 int highestValueInEnum<EnumType>() {
  int[] values = (int[])Enum.GetValues(typeof(EnumType));
  int highestValue = values[0];
  for(int index = 0; index < values.Length; ++index) {
    if(values[index] > highestValue) {
      highestValue = values[index];
    }
  }

  return highestValue;
}

如您所见,我将Enum.GetValues()的返回值转换为int [],而不是EnumType []。这是因为我以后不能将EnumType(这是一个泛型类型参数)转换为int。

代码有效。但它有效吗? 我是否可以始终将Enum.GetValues()的返回值转换为int []?

3 个答案:

答案 0 :(得分:20)

不,你无法安全地转向int[]。枚举类型并不总是使用int作为基础值。如果你将自己局限于的基础类型为int的枚举类型,那么它应该没问题。

这感觉就像你(或我)可以扩展Unconstrained Melody以支持你想要的东西 - 在编译时真正地将类型限制为枚举类型,并且为任何<工作/ em>枚举类型,即使是那些具有基础基础的类型,例如longulong

如果没有Unconstrained Melody,你仍然可以使用所有枚举类型有效地有效实现IComparable这一事实来做到这一点。如果你使用的是.NET 3.5,它就是一个单行程序:

private static TEnum GetHighestValue<TEnum>() {
  return Enum.GetValues(typeof(TEnum)).Cast<TEnum>().Max();
}

答案 1 :(得分:3)

根据Jon Skeet的建议(也谢谢你,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;
}

对于任何抓取代码的人,您可能需要添加额外的检查,以便它不会在空的枚举中爆炸。

答案 2 :(得分:0)

轻松!使用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
}