gpt4 book ai didi

.net - 是否有像 Java 的 enum.ordinal() 这样的 .NET 构造?

转载 作者:行者123 更新时间:2023-12-02 20:47:18 24 4
gpt4 key购买 nike

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

type Note =
| C = 0
| D = 2
| E = 4
| F = 5
| G = 7
| A = 9
| B = 11

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

let getNoteOrdinal = function
|Note.C -> 1
|Note.D -> 2
|Note.E -> 3
|Note.F -> 4
//etc

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

最佳答案

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

the docs ,您可以进行简单的转换来获取该值,例如:

let value = int Note.B

在本例中,value11

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

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

let value = getNoteOrdinal Note.E

在本例中,value3

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

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

关于.net - 是否有像 Java 的 enum.ordinal() 这样的 .NET 构造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54594783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com