如果字符串以特定字符串开头,如何将子字符串添加到字典?

时间:2014-10-15 02:24:05

标签: f# c#-to-f#

我正在解析由换行符分隔的字符串。为此,我有:

for line in str.Split([|Environment.NewLine|], StringSplitOptions.None) do

这给了我每条线路。我想做的是取line,如果它以某个字符串开头,则将余数添加到字典中,并以起始字符串作为键。基本上,我想在F#中实现以下逻辑:

if line equals "[end]" then
    break
else if line startsWith "string1" then
    add the rest of line to a dictionary with the key "string1"
else if line startsWith "string2" then
    add the rest of line to a dictionary with the key "string2"
else
    continue

根据我发现的情况,我应该使用match..with语句来执行此操作,而不是按照this的顺序将其音译为F#。

到目前为止,我有:

open System
open System.IO
open System.Collections.Generic

let str =
    "Some string that
    spans multiple lines
    with prefixes
    [end]"

let (|Prefix|_|) (p:string) (s:string) =
    if s.StartsWith(p) then
        Some(s.Substring(p.Length))
    else
        None

let dict = new Dictionary<string, string>();

for line in str.Split([|Environment.NewLine|], StringSplitOptions.None) do
    match line with
    | Prefix "[end]" -> dict                         // stop searching
    | Prefix "spans" rest -> dict.Add("spans", rest) // add to dictionary
    | _ -> ()                                        // continue searching

这给了我以下错误,我不确定如何处理:

test.fs(20,5): error FS0001: Type mismatch.
Expecting a string -> 'a option but given a string -> string -> string option    
The type ''a option' does not match the type 'string -> string option'

我使用MonoDevelop /开源F#编译器,如果这对任何事情都很重要,但我认为不会。

1 个答案:

答案 0 :(得分:2)

所以我修复了一些错误:

字符串文字应为

let str =
    "Some string that
spans multiple lines
with prefixes
[end]"

或者你在每行的开头都有一些你不想要的空格

匹配应该看起来像

for line in str.Split([|Environment.NewLine|], StringSplitOptions.None) do
    match line with
    | Prefix "[end]" rest -> ()          
    | Prefix "spans" rest -> dict.Add("spans", rest) 
    | _ -> ()     

在这里,F#并没有像break这样的东西,所以我让第一个和最后一个案例无所作为。我认为这应该做你想要的。