得到F#enum序数(即不是联盟)

LSM*_*M07 5 .net enums f#

问:是否有像Java这样的.NET构造Note.C = 1, Note.D = 2,

如果我在F#中有以下枚举:

type Note =
    | C = 0
    | D = 2
    | E = 4
    | F = 5
    | G = 7
    | A = 9
    | B = 11
Run Code Online (Sandbox Code Playgroud)

但是在某些方面,我需要其中的项目的序数,这样foo.ordinal()等等.显然在其他语言中,Note.C = 1, Note.D = 2,可以工作,但在这里有必要使用这样的函数:

let getNoteOrdinal = function
    |Note.C -> 1
    |Note.D -> 2
    |Note.E -> 3
    |Note.F -> 4
    //etc
Run Code Online (Sandbox Code Playgroud)

这个功能是必要的还是有更好的东西?

Cha*_*ger 4

.NET 中的枚举只是整数类型之上的一层,在本例中,您的值是int.

根据文档,您可以进行简单的转换来获取该值,例如:

let value = int Note.B
Run Code Online (Sandbox Code Playgroud)

value在这种情况下会在哪里11

要查找序数,您可以使用内置函数,该函数会按顺序提供所有值的数组,然后找到您要查找的值的索引。例如:

let getNoteOrdinal (note: Note) =
    let values = Enum.GetValues(typeof<Note>)
    Array.IndexOf(values, note) + 1

let value = getNoteOrdinal Note.E

Run Code Online (Sandbox Code Playgroud)

value在这种情况下会在哪里3

您可以按照 @ReedCopsey 的建议更进一步,创建一个通用函数,为您提供任何枚举值的序数:

let getEnumOrdinal (e: 'a when 'a : enum<'b> and 'a : equality) =    
    let values = Enum.GetValues(e.GetType())
    Array.IndexOf(values, e) + 1
Run Code Online (Sandbox Code Playgroud)

  • @LSM07 一般来说,.NET 建议您将序数视为实现细节,而不是作为逻辑基础的东西。使用它几乎是令人皱眉的。这有什么用例? (3认同)