Оптимизация F # манипуляции со строками - PullRequest
6 голосов
/ 03 августа 2010

Я только изучаю 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 ]

17 голосов
/ 03 августа 2010
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"
5 голосов
/ 03 августа 2010

Как то так?

[<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)
4 голосов
/ 03 августа 2010

Попробуйте следующее

[<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 возвращает первый элемент, для которого лямбда возвращает true. Поскольку он всегда возвращает true, он просто вернет первый элемент или None. Как только вы установили, есть хотя бы один элемент, который, как вы знаете, data не является null и, следовательно, может вызывать подстроку

.
2 голосов
/ 03 августа 2010

Нет ничего плохого в использовании функций библиотеки .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..]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...