代码之家  ›  专栏  ›  技术社区  ›  Norman H

优化F字符串操作

  •  6
  • Norman H  · 技术社区  · 14 年前

    我只是在学习F,并且一直在将C扩展方法库转换为F。我目前正致力于实现一个名为convertFirstLetterToUpperCase的函数,该函数基于 C以下实施 :

    public static string ConvertFirstLetterToUppercase(this string value) {
        if (string.IsNullOrEmpty(value)) return value;
        if (value.Length == 1) return value.ToUpper();
        return value.Substring(0, 1).ToUpper() + value.Substring(1);
    }
    

    F实施

    [<System.Runtime.CompilerServices.ExtensionAttribute>]
    module public StringHelper
        open System
        open System.Collections.Generic
        open System.Linq
    
        let ConvertHelper (x : char[]) =  
            match x with
                | [| |] | null -> ""
                | [| head; |] -> Char.ToUpper(head).ToString()
                | [| head; _ |] -> Char.ToUpper(head).ToString() + string(x.Skip(1).ToArray())
    
        [<System.Runtime.CompilerServices.ExtensionAttribute>]
        let ConvertFirstLetterToUppercase (_this : string) =
            match _this with
            | "" | null -> _this
            | _ -> ConvertHelper (_this.ToCharArray())
    

    有人能给我展示一个使用更自然的f语法的更简洁的实现吗?

    4 回复  |  直到 14 年前
        1
  •  5
  •   desco    14 年前

    像这样?

    [<System.Runtime.CompilerServices.ExtensionAttribute>]
    module public StringHelper = 
    [<System.Runtime.CompilerServices.ExtensionAttribute>]
    let ConvertFirstLetterToUppercase (t : string) =
        match t.ToCharArray() with
        | null -> t
        | [||] -> t
        | x -> x.[0] <- Char.ToUpper(x.[0]); System.String(x)
    
        2
  •  17
  •   Juliet    14 年前
    open System
    
    type System.String with
        member this.ConvertFirstLetterToUpperCase() =
            match this with
            | null -> null
            | "" -> ""
            | s -> s.[0..0].ToUpper() + s.[1..]
    

    用途:

    > "juliet".ConvertFirstLetterToUpperCase();;
    val it : string = "Juliet"
    
        3
  •  4
  •   JaredPar    14 年前

    尝试以下操作

    [<System.Runtime.CompilerServices.ExtensionAttribute>]
    module StringExtensions = 
        let ConvertFirstLetterToUpperCase (data:string) =
            match Seq.tryFind (fun _ -> true) data with
            | None -> data
            | Some(c) -> System.Char.ToUpper(c).ToString() + data.Substring(1)
    

    这个 tryFind 函数将返回lambda返回的第一个元素 true . 因为它总是返回true,所以只返回第一个元素或 None . 一旦你确定了,至少有一个要素你知道 data 不是 null 因此可以调用子字符串

        4
  •  2
  •   Joel Mueller    14 年前

    从.NET语言中使用.NET库函数没有任何问题。也许直接翻译C扩展方法是最合适的,特别是对于这样一个简单的函数。虽然我很想像朱丽叶那样使用切片语法,只是因为它很酷。

    open System
    open System.Runtime.CompilerServices
    
    [<Extension>]
    module public StringHelper =
    
        [<Extension>]
        let ConvertFirstLetterToUpperCase(this:string) =
            if String.IsNullOrEmpty this then this
            elif this.Length = 1 then this.ToUpper()
            else this.[0..0].ToUpper() + this.[1..]