【问题标题】:How to extract data from iterating a sequence如何从迭代序列​​中提取数据
【发布时间】:2016-09-13 19:30:10
【问题描述】:

csvData1 包含 .csv 文件中的数据。我只用电子表格中的两列创建了一个序列 ("GIC-ID", "COVERAGE DESCRIPTION")

let mappedSeq1 = 
   seq { for csvRow in csvData1 do yield (csvRow.[2], csvRow.[5]) }

在 Visual Studio 调试器中查看 x 最终是 System.Tuple<string,string>

for x in mappedSeq1 do
    printfn "%A" x
    printfn "%A" x.ToString

这是执行的结果

for x in mappedSeq1

("GIC-ID", "COVERAGE DESCRIPTION")
<fun:main@28>

我很难弄清楚如何访问x,所以我可以提取第一个元素。

【问题讨论】:

  • 你应该可以做到for (gicId, desc) in mappedSeq1 do...
  • 我认为你得到了
    因为 x.ToString 的意思是“x 的 ToString 函数”,可能你想用括号来做 x.ToString() 这意味着“执行 x" 的 ToString 函数。

标签: f# seq


【解决方案1】:

你可以使用模式匹配来解构元组

for (a, b) in mappedSeq1 do
  // ...

for x in mappedSeq1 do
  let a, b = x

或者,对于 2 元组,您可以使用内置函数 fstsnd

【讨论】:

  • @octopusgrabbus x 无论如何都不应该是 seq 而是 2 元组(来自您提供的示例),因此应该可以工作(或者问题中缺少信息)跨度>
  • 当我打印出 x 时,它是一个函数。我不能使用 .fst,因为它不是对象的方法。
  • @octopusgrabbus x 不是函数;你认为这是因为printfn "%A" x.ToStringToString 是一个函数,ToString ()(注意括号)是调用该函数的结果。你也不要“点进去”来使用fst这是一个“免费功能”,必须以这种方式使用let firstPart = fst x
【解决方案2】:

使用Seq.mapfst 获取仅包含元组第一个组件的序列:

let firstOnly = mappedSeq |> Seq.map fst

【讨论】:

  • Seq.map fst 就够了 ;)
  • @Sehnsucht 谢谢。 Linq 习惯。
  • 无法让它在 mappedSeq1 中的 x in for x 上工作。这是一个函数。
  • 如果 x 是一个函数,那么你问题的这一部分:x 最终成为一个 System.Tuple。是不正确的。请调整问题。
  • 另外,这个语法:seq { for csvRow in csvData1 do yield (csvRow.[2], csvRow.[5]) } 将产生一个元组序列。
猜你喜欢
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
相关资源
最近更新 更多