【问题标题】:Project new values from existing value从现有值中投射新值
【发布时间】:2013-12-03 15:33:12
【问题描述】:

我正在编写我的第一个 F# 程序,目的只是为了学习 F#。

我想要的是提供日期列表和这些日期的属性(例如DayOfWeek、DayOfMonth)。我设法提供了日期列表,并且我知道 .net 框架为我提供了提取所有属性所需的一切,我只是不知道如何将属性添加为列表中的新列。 到目前为止,这是我所拥有的:

type Span = Span of TimeSpan with
 static member (+) (d:DateTime, Span wrapper) = d + wrapper //this is defining the + operator
 static member Zero = Span(new TimeSpan(0L))

type Dates() = 

 let a = DateTime.Parse("01/12/2013")
 let b  =DateTime.Parse("02/12/2013")
 let ts = TimeSpan.FromDays(1.0)
 member this.Get() = [a .. Span(ts) .. b]

let mydates = new Dates()
mydates.Get()

当我运行该代码时,我会得到一个 DateTime 值列表,列表中有 2 条记录。我现在可以这样做:

mydates.Get() |> List.map (fun x -> x.DayOfWeek);;

返回:

验证它:DayOfWeek 列表 = [星期日;星期一]

mydates.Get() |> List.map (fun x -> x.DayOfYear);;

返回:

验证它:int list = [335; 336]

这一切都很好,但是我想做的是投影一个包含 2 个“列”(如果列是正确的词)的列表,以便我的输出是(类似于):

验证它:int list = [(Sunday,335); (星期一,336)]

我希望这能解释我所追求的。

谢谢

杰米

【问题讨论】:

  • 我不太明白你的问题,你的所有代码似乎都运行良好,你想过滤Get()的输出
  • 要从现有列表中创建新的值列表,您可以执行以下操作:[for x in 1..5 -> x * x]。这将创建一个 x 的正方形列表,但该部分可以替换为您想要的任何投影。这就是你要找的东西吗?
  • 你能给我们三行你期望输出的样子吗?
  • 大家好,非常感谢您到目前为止的回复。我真的没有很好地解释这一点,不是吗?因此,我对其进行了修改,希望能更好地解释我所追求的。

标签: f#


【解决方案1】:

对于您的示例,解决方案很简单,让地图返回一个像这样的元组

mydates.Get() |> List.map (fun x -> x.DayOfWeek,x.DayOfYear);;

【讨论】:

  • 是的,这确实非常简单:) 谢谢你,约翰,希望你能告诉我我是一个真正的新手。
  • 嗨,约翰,如果可以的话,请提出后续问题。我之前没有说的是我将其包装为 Web API,这意味着最终这个东西会返回 JSON。我遇到的问题是 JSON 字段具有 m_item1、m_Item3 等名称,而不是 DayOfWeek、DayOfYear 等。有没有办法给元组的元素取别名(即给它们一个有意义的名称)?
  • 您可以使用记录类型 - 请参阅 msdn.microsoft.com/en-us/library/dd233184.aspx
猜你喜欢
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多