枚举的颜色

Fra*_*oty 0 .net enums f# colors

我的想法是在一些颜色之间切换,所以我不必使用多个笔,但我只能声明一个.

我不太确定能够准确理解枚举是如何工作的,请纠正我:

type ColorType =
  | Red = Color.Red
  | Green = Color.Green
  | Blue = Color.Blue
Run Code Online (Sandbox Code Playgroud)

我希望用它:

let p = new Pen(ColorType.[index])
g.DrawRectangle(p, 0, 0, 10, 10)
Run Code Online (Sandbox Code Playgroud)

其中index是一个int变量(0到2)我将用来切换我的颜色.问题是我无法声明枚举,不接受Color.可能的解决方案?

Dan*_*iel 5

要按索引访问颜色,可以将它们放在一个数组中:

let colors =
  [|
    Color.Red
    Color.Green
    Color.Blue
  |]

let p = new Pen(colors.[index])
g.DrawRectangle(p, 0, 0, 10, 10)
Run Code Online (Sandbox Code Playgroud)


Tom*_*cek 5

您可能希望使用数组或其他集合来存储颜色:

let colors = 
  [| Color.Red 
     Color.Green 
     Color.Blue |]

let p = new Pen(colors.[index]) 
g.DrawRectangle(p, 0, 0, 10, 10) 
Run Code Online (Sandbox Code Playgroud)

枚举设计用于完全不同的目的.如果要枚举许多选项并按名称访问它们(而不是通过索引访问它们),它们很有用.例如,您可以使用枚举来表示某些状态机的状态,或其他选项.

在您的示例中,如果您想将不同颜色与不同类型的图形元素相关联,它们将非常有用.假设您想使用一种颜色作为背景而另一种颜色用于前景 - 您可以定义枚举或F#distriminated union来表示两种情况:

type ColorType = 
  | Foreground
  | Background
Run Code Online (Sandbox Code Playgroud)

...然后你可以定义一个集合,将实际颜色分配给各个类型:

let colors = 
  dict [ (ColorType.Foreground, Color.Red);
         (ColorType.Background, Color.Black) ]
Run Code Online (Sandbox Code Playgroud)

然后你可以colors.[ColorType.Foreground]用来获得指定种类的颜色(在这种情况下会是红色).但是,您无法通过索引访问枚举(或F#区分联合)的情况.

这是F#的基本方面,所以你可能想查看F#WikiBook,阅读MSDN上的一些介绍或者购买其中一本F#书.