F # Преобразовать массив строк в строку - PullRequest
6 голосов
/ 28 мая 2011

С C # я могу использовать string.Join("", lines) для преобразования массива строк в строку. Что я могу сделать, чтобы сделать то же самое с F #?

ДОБАВЛЕНО

Мне нужно прочитать строки из файла, выполнить некоторую операцию, а затем объединить все строки в одну строку.

Когда я запускаю этот код

open System.IO
open String

let lines = 
  let re = System.Text.RegularExpressions.Regex(@"#(\d+)")
  [|for line in File.ReadAllLines("tclscript.do") ->
      re.Replace(line.Replace("{", "{{").Replace("}", "}}").Trim(), "$1", 1)|]

let concatenatedLine = String.Join("", lines)

File.WriteAllLines("tclscript.txt", concatenatedLine)

Я получил эту ошибку

error FS0039: The value or constructor 'Join' is not defined

Я попробовал этот код let concatenatedLine = lines |> String.concat "", чтобы получить эту ошибку

error FS0001: This expression was expected to have type
    string []    
but here has type
    string

Решение

open System.IO
open System 

let lines = 
  let re = System.Text.RegularExpressions.Regex(@"#(\d+)")
  [|for line in File.ReadAllLines("tclscript.do") ->
      re.Replace(line.Replace("{", "{{").Replace("}", "}}"), "$1", 1) + @"\n"|]

let concatenatedLine = String.Join("", lines)
File.WriteAllText("tclscript.txt", concatenatedLine)

и этот тоже работает.

let concatenatedLine = lines |> String.concat ""

Ответы [ 3 ]

14 голосов
/ 28 мая 2011

использовать String.concat?

["a"; "b"]
|> String.concat ", " // "a, b"

РЕДАКТИРОВАНИЕ:

в вашем коде замените File.WriteAllLines на File.WriteAllText

let concatenatedLine = 
    ["a"; "b"]
    |> String.concat ", "

open System.IO

let path = @"..."
File.WriteAllText(path, concatenatedLine)
4 голосов
/ 28 мая 2011

Скопировано из окна консоли fsi:

> open System;;
> let stringArray = [| "Hello"; "World!" |];;

val stringArray : string [] = [|"Hello"; "World!"|]

> let s = String.Join(", ", stringArray);;

val s : string = "Hello, World!"

>

EDIT:

Использование String.Join из библиотеки классов .NET Framework, конечно, менее идиоматично, чем использование String.concat из базовой библиотеки F #. Я могу только предположить, что именно поэтому кто-то отклонил мой ответ, поскольку этот человек не выразил любезность объяснять мотивы голосования.

Причина, по которой я опубликовал этот ответ, как я уже упоминал в своем комментарии ниже, заключается в том, что использование String.concat во всех остальных ответах может ввести в заблуждение читателей, которые думают, что String.Join вообще не доступен в F #.

0 голосов
List.ofSeq "abcd" |> List.toArray |> (fun s -> System.String s) |> printfn "%A"
List.ofSeq "abcd" |> List.toArray |> (fun s -> new System.String(s)) |> printfn "%A"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...