将元素添加到序列中

时间:2014-11-09 20:23:13

标签: csv f# f#-3.0

我有一个我正在阅读的csv文件

Din, Anh , 69
James, Urbank,61

我想添加另一个名字"欧内斯特,古巴,70"到csv字符串,所以我首先用逗号分隔每个值。我开始寻找插入函数并找到一个,所以我将这一行添加到我的代码

 |>Seq.map (fun values -> 
         values.[0].Insert(0,"Ernest")),
         values.[1].Insert(0,"Cuban")),
         float values.[2].Insert(0,"70"))

显然,没有工作的是最终发生的事情是欧内斯特被添加到Din和James的开头,古巴到Anh和Urbank的开头,70到69和61的开头。

ErnestDin , CubanAnh , 7061

所以我的问题是如何将这些值添加到我的seq中,请记住,Ernest将位于Din和James的中间,因为序列必须按字母顺序排列。 我研究并发现Map.add给了我一个字母数字作为结果,而Seq.Append似乎只用整数。

2 个答案:

答案 0 :(得分:2)

F#中的序列是不可变的,因此您不能只将数据插入其中。如果您的数据集不是太大,最简单的解决方案可能只是将新数据添加到列表的头部,然后对其进行排序:

> let data = [("Din", "Anh" , 69); ("James", "Urbank", 61)];;

val data : (string * string * int) list =
  [("Din", "Anh", 69); ("James", "Urbank", 61)]

> ("Ernest", "Cuban", 70) :: data |> Seq.sort;;
val it : seq<string * string * int> =
  seq [("Din", "Anh", 69); ("Ernest", "Cuban", 70); ("James", "Urbank", 61)]

请注意,这很可能不是最有效的解决方案,但它是Easy:)

答案 1 :(得分:0)

您可以使用生成原始序列和新元素的seq构造函数构建新序列。

让我们假设您有一个采用新元素和原始序列的函数:

let appendElement (row:'a) (s:seq<'a>) = seq{
            yield! s
            yield row
        }

let data = [("Din", "Anh" , 69); ("James", "Urbank", 61)] // which is also a sequence

let newData = data 
                |> appendElement ("Ernest", "Cuban", 70) 
                |> appendElement ("Other", "Other", 5) 
                |> List.ofSeq

List.ofSeq将使用新元素迭代序列,如果稍后迭代序列,则可以将其删除。 在使用序列时,它比操作列表更有效。