如何在C#中获取枚举索引值

时间:2011-06-02 10:44:53

标签: c# c enums integer

在C中,enums在内部等于整数。因此,我们也可以将enum的数据类型视为整数。

如何用C#实现同样的目标?

9 个答案:

答案 0 :(得分:71)

只需将其投放到int,如下所示:

int eValue = (int)enumValue;

这是另一个向您展示如何设置内部整数值的示例:

public enum MyEnum
{
    MyValue1 = 1,
    MyValue2 = 2
}

(int)MyEnum.MyValue2 == 2; // True

答案 1 :(得分:30)

将Enum-Type转换为int的另一种方法:

enum E
{
    A = 1,   /* index 0 */
    B = 2,   /* index 1 */
    C = 4,   /* index 2 */
    D = 4    /* index 3, duplicate use of 4 */
}

void Main()
{
    E e = E.C;
    int index = Array.IndexOf(Enum.GetValues(e.GetType()), e);
    // index is 2

    E f = (E)(Enum.GetValues(e.GetType())).GetValue(index);
    // f is  E.C
}

更复杂但独立于分配给枚举值的INT值。

答案 2 :(得分:9)

默认情况下,枚举中每个元素的基础类型都是整数。

enum Values
{
   A,
   B,
   C
}

您还可以为每个项目指定自定义值:

enum Values
{
   A = 10,
   B = 11,
   C = 12
}
int x = (int)Values.A; // x will be 10;

注意:默认情况下,第一个枚举数的值为0.

答案 3 :(得分:4)

你可以直接施放它:

<header>
    <div class="container clearfix">
        <h1 id="logo">
            LOGO
        </h1>
        <nav>
            <a href="">Lorem</a>
            <a href="">Ipsum</a>
            <a href="">Dolor</a>
        </nav>
    </div>
</header><!-- /header -->

例如:

function init() {
    window.addEventListener('scroll', function(e){
        var distanceY = window.pageYOffset || document.documentElement.scrollTop,
            shrinkOn = 300,
            header = document.querySelector("header");
        if (distanceY > shrinkOn) {
            classie.add(header,"smaller");
        } else {
            if (classie.has(header,"smaller")) {
                classie.remove(header,"smaller");
            }
        }
    });
}
window.onload = init();

答案 4 :(得分:1)

使用演员:

public enum MyEnum : int    {
    A = 0,
    B = 1,
    AB = 2,
}


int val = (int)MyEnum.A;

答案 5 :(得分:1)

使用简单的施法:

int value = (int) enum.item;

请参阅enum (C# Reference)

答案 6 :(得分:0)

using System;
public class EnumTest 
{
    enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

    static void Main() 
    {

        int x = (int)Days.Sun;
        int y = (int)Days.Fri;
        Console.WriteLine("Sun = {0}", x);
        Console.WriteLine("Fri = {0}", y);
    }
}

答案 7 :(得分:0)

设计师c#可能选择不进行枚举自动转换的一个原因是为了防止意外混合不同的枚举类型...

e.g. this is bad code followed by a good version
enum ParkingLevel { GroundLevel, FirstFloor};
enum ParkingFacing { North, East, South, West }
void Test()
{
    var parking = ParkingFacing.North; // NOT A LEVEL
    // WHOOPS at least warning in editor/compile on calls
    WhichLevel(parking); 

    // BAD  wrong type of index, no warning
    var info = ParkinglevelArray[ (int)parking ];
}


// however you can write this, looks complicated 
// but avoids using casts every time AND stops miss-use
void Test()
{
  ParkingLevelManager levels = new ParkingLevelManager();
  // assign info to each level
  var parking = ParkingFacing.North;

  // Next line wrong mixing type 
  // but great you get warning in editor or at compile time      
  var info=levels[parking];

  // and.... no cast needed for correct use
  var pl = ParkingLevel.GroundLevel;
  var infoCorrect=levels[pl];

}
class ParkingLevelInfo { /*...*/ }
class ParkingLevelManager
{
    List<ParkingLevelInfo> m_list;
    public ParkingLevelInfo this[ParkingLevel x] 
 { get{ return m_list[(int)x]; } }}

答案 8 :(得分:0)

在回答这个问题时,我将“值”定义为枚举项的值,并将索引定义为枚举定义(按值排序)中的位置。 OP的问题要求“索引”,并且各种答案都将其解释为“索引”或“值”(根据我的定义)。有时索引等于数值。

没有特别的答案解决在Enum是Enum标志的情况下查找索引(不是值)的情况。

Enum Flag
{
    none = 0       // not a flag, thus index =-1
    A = 1 << 0,   // index should be 0
    B = 1 << 1,   // index should be 1 
    C = 1 << 2,   // index should be 2 
    D = 1 << 3,   // index should be 3,
    AandB = A | B // index is composite, thus index = -1 indicating undefined
    All = -1      //index is composite, thus index = -1 indicating undefined
}

对于Flag Enums,索引仅由

给出
var index = (int)(Math.Log2((int)flag)); //Shows the maths, but is inefficient

但是,上述解决方案是 (a)@phuclv指出的效率低下(Math.Log2()是浮点且代价高昂),并且 (b)不解决Flag.none的情况,也不处理任何复合标志-由其他标志组成的标志(例如,在我的示例中为“ AandB”标志)。

DotNetCore 如果使用点网核心,我们可以按以下方式解决上面的a)和b):

int setbits = BitOperations.PopCount((uint)flag); //get number of set bits
if (setbits != 1) //Finds ECalFlags.none, and all composite flags
    return -1;   //undefined index
int index = BitOperations.TrailingZeroCount((uint)flag); //Efficient bit operation

不是DotNetCore BitOperations仅在点网核心中工作。有关一些有效的建议,请参见此处的@phuclv答案https://stackoverflow.com/a/63582586/6630192

    根据我对他的回答的评论,如果使用复合标志,
  • @ user1027167答案将不起作用
  • 谢谢@phuclv提出提高效率的建议