7

我想在 F# 中使用 String.Split 的 .NET CLR 版本。具体来说,我想使用这段代码:

let main argv = 
    let s = "Now is the time for FOO good men to come to the aide of their country"
    let sepAry = [|"FOO"; "BAR"|]
    let z1 = s.Split sepAry
    0 // return an integer exit code

然而,这无法编译,因为(我相信)F# 中的 Split 版本的实现方式与 .Net 4.5 中的不同。我想要的 .NET 版本是:

Split(String[], StringSplitOptions) 返回一个字符串数组,其中包含此字符串中由指定字符串数组的元素分隔的子字符串。一个参数指定是否返回空数组元素。

我知道我正在获得拆分的 F# 版本,它以前驻留在 PowerPack 中,这就是实现与 CLR 版本不同的原因。

获得我想要的东西的最佳方式是什么?是否可以覆盖 F# 版本的 Split 并使用 .Net 版本?是否可以扩展 F# 版本,如果可以,如何扩展?

4

3 回答 3

7

您要使用的重载需要第二个参数。

let z1 = s.Split (sepAry, System.StringSplitOptions.None)

它不是“F# 版本的Split”,它与Split您在 C# 中看到的完全一样。

于 2013-05-27T20:20:49.220 回答
0

这里有2个问题:

  1. 对于 .NET BCL,您需要指定 (),因为使用元组以不同的方式声明参数(参见http://msdn.microsoft.com/en-us/library/dd483468.aspx
  2. 只有 char[] 重载没有 StringSplitOptions。如果要使用字符串数组,还需要指定 StringSplitOptions。

您可以创建自己的 F# 重载方法,该方法为字符串拆分选项提供默认值。

于 2013-05-27T20:35:15.323 回答
0

Kirelagin 是对的,您尝试使用的 String 上的 Split 方法不存在,它仅适用于没有辅助参数的 char 数组。你必须求助于这个版本:http: //msdn.microsoft.com/en-us/library/tabh47cf.aspx。此外,在调用 none-f# .NET api 时,您必须在参数周围使用括号,因为 C# 中的参数被定义为元组。

您当然可以在 String 上定义自己的扩展方法,这样您就不必一直指定 None 如果这是您预期的默认行为

type System.String with
  member x.Split(separator : (string [])) = x.Split(separator, System.StringSplitOptions.None)
于 2013-05-27T20:39:38.777 回答