2

最近のプロジェクトに取り組んでいる間、私を悩ませてきた何か。文字列をタイトルケースに変更するネイティブ関数がC#にないのはなぜですか?

例えば

string x = "hello world! THiS IS a Test mESSAGE";
string y = x.ToTitle(); // y now has value of "Hello World! This Is A Test Message"

とが.ToLowerあり.ToUpper、TextInfoオブジェクト(同じプロセス)を使用または作成できることを感謝しますがSystem.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase、それはとても...醜いです。

誰もが理由を知っていますか?

4

3 に答える 3

2

実際には次のようになります:TextInfo.ToTitleCase

なぜそこにあるのですか?ケーシングは現在の文化に依存しているからです。たとえば、トルコの文化では、「i」と「I」の文字の大文字と小文字が異なります。これについて詳しくは、こちらをご覧ください。

更新:実際、私は@Cashleyに同意します。これは、クラスにToTitleCaseメソッドがないことStringは、MicroSoftの見落としのように見えると言っています。見てみるString.ToUpper()String.ToLower()、両方がTextInfo内部で使用されていることがわかります。

public string ToUpper()
{
    return this.ToUpper(CultureInfo.CurrentCulture);
}

public string ToUpper(CultureInfo culture)
{
    if (culture == null)    
        throw new ArgumentNullException("culture");

    return culture.TextInfo.ToUpper(this);
}

ですから、同じ方法があるはずだと思いますToTitleCase()。たぶん、.NETチームはString、主に使用されるメソッドのみをクラスに追加することを決定しました。遠ざける理由は他にありませんToTitleCase

于 2013-02-04T16:24:54.203 に答える
0

ここにこれの拡張方法がありますが、それは文化固有ではありません。

String.ToUpperのようにCurrentCulture.TextInfoをラップするだけで、おそらくより良い実装になります。

class Program
{
    static void Main(string[] args)
    {
        string s = "test Title cAsE";
        s = s.ToTitleCase();
        Console.Write(s);
    }
}
public static class StringExtensions
{
    public static string ToTitleCase(this string inputString)
    {
        return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(inputString);
    }

    public static string ToTitleCase(this string inputString, CultureInfo ci)
    {
        return ci.TextInfo.ToTitleCase(inputString);
    }
}
于 2013-02-04T16:29:08.193 に答える
0
  Dim myString As String = "wAr aNd pEaCe"

  ' Creates a TextInfo based on the "en-US" culture.
  Dim myTI As TextInfo = New CultureInfo("en-US", False).TextInfo

  ' Changes a string to titlecase.
  Console.WriteLine("""{0}"" to titlecase: {1}", myString, myTI.ToTitleCase(myString))

また

  string myString = "wAr aNd pEaCe";

  // Creates a TextInfo based on the "en-US" culture.
  TextInfo myTI = new CultureInfo("en-US", false).TextInfo;

  // Changes a string to titlecase.
  Console.WriteLine("\"{0}\" to titlecase: {1}", myString, myTI.ToTitleCase(myString));
于 2013-02-04T16:31:39.103 に答える