将内容添加到f#中的列表

Jak*_*son 13 f#

我正在f#中做一个名为"2D形状编辑器"的项目.我之前在c#中完成了这个项目,所以我已经掌握了如何连接两个形状的所有逻辑.所以我知道我需要一个列表来保存我将要添加的所有形状.但我根本无法让我的addToList方法起作用.

我的ShapeList:

let mutable ShapeList:List<RectangleZ> =  [RectangleZ(100,100)] 
Run Code Online (Sandbox Code Playgroud)

我的添加方法:

let addToList (listan:List<RectangleZ>) (element:RectangleZ) = let ShapeList =     ShapeList@[element] in ShapeList
//Method to add into the ShapeList

let addToList (listan:List<RectangleZ>) (element:RectangleZ) = element::ShapeList
//Other try on adding into shapeList
Run Code Online (Sandbox Code Playgroud)

应该向ShapeList添加矩形的按钮:

btn.Click.Add(fun _ -> new RectangleZ(500, 100) |> addToList ShapeList |>ignore |> saver)
//Button click method that should be adding the RectangleZ(500, 100) to my ShapeList
Run Code Online (Sandbox Code Playgroud)

当然我的矩形:

type RectangleZ(x:int, y:int)= 
  let mutable thisx = x
  let mutable thisy = y
  let mutable thiswidth = 50
  let mutable thisheight = 20
  let brush = new SolidBrush(Color.Black)
  member obj.x with get () = thisx and set x = thisx <- x
  member obj.y with get () = thisy and set y = thisy <- y
  member obj.width with get () = thiswidth and set width = thiswidth <- width
  member obj.height with get () = thisheight and set height = thisheight <- height
  member obj.thisColor = Color.FromArgb(167, 198, 253)
  member obj.draw(paper:Graphics) = paper.FillRectangle(brush, thisx, thisy, 50, 20)
  member obj.ShapeType = "Rectangle"
Run Code Online (Sandbox Code Playgroud)

由于某些原因,我的addToList函数都没有将元素添加到列表中.我的问题是为什么?

Evg*_*zin 16

F#中的列表是不可变的.这意味着当您将项目添加到列表时,如下所示:

let newlist = elem :: tail;;
Run Code Online (Sandbox Code Playgroud)

旧列表(尾部)不会更改,而是创建新列表.因此,您需要从addToList函数返回新列表,然后更新可变变量:

let addToList (listan:List<RectangleZ>) (element:RectangleZ) = element::listan
ShapeList <- addToList ShapeList newElement
Run Code Online (Sandbox Code Playgroud)

在您的代码中let ShapeList是本地的,不会影响全局ShapeList变量.


Has*_*sef 6

您可以List.appendmutable列表一起使用,下面的示例对我来说效果很好:

let mutable season_averages = []
for i in 0 .. n_seasons do
     season_averages  <- [i] |> List.append season_averages
printfn "Seasons Average: %A" season_averages
Run Code Online (Sandbox Code Playgroud)


ale*_*rya 6

let newList = oldList @ [newElement]
Run Code Online (Sandbox Code Playgroud)