643 Stimmen

Den ersten Buchstaben einer Zeichenkette groß schreiben (mit maximaler Leistung)

Ich habe eine DetailsView mit einer TextBox und ich möchte die Eingangsdaten sein immer gespeichert mit dem erster Buchstabe in Großbuchstaben .

Exemple :

"red" --> "Red"
"red house" --> " Red house"

Wie kann ich das erreichen? Leistungsmaximierung ?


Hinweis :

Ausgehend von den Antworten und den Kommentaren unter den Antworten denken viele, dass es hier um die Kapitalisierung geht alle Wörter in der Zeichenkette. z.B. => Red House Ist es nicht, aber wenn es das ist, was Sie suchen suchen Sie nach einer der Antworten, in der TextInfo 's ToTitleCase Methode. (Anmerkung: Diese Antworten sind falsch für die tatsächlich gestellte Frage). Siehe TextInfo.ToTitleCase Dokumentation für Vorbehalte (berührt keine Wörter in Großbuchstaben - sie werden als Akronyme betrachtet; kann Buchstaben in der Mitte von Wörtern kleinschreiben, die nicht kleingeschrieben werden sollten, z. B. "McDonald" "Mcdonald"; nicht garantiert, dass alle kulturspezifischen Feinheiten in Bezug auf Großschreibregeln berücksichtigt werden).


Hinweis :

Die Frage lautet zweideutig die Frage, ob die Buchstaben nach dem ersten Buchstaben gezwungen a Kleinschreibung . Die akzeptierte Antwort geht davon aus, dass nur der erste Buchstabe sollte geändert werden . Wenn Sie Folgendes erzwingen wollen alle Buchstaben der Zeichenkette außer dem ersten klein geschrieben werden soll, suchen Sie nach einer Antwort, die ToLower y die nicht ToTitleCase enthalten .

10 Stimmen

@Bobby: Es handelt sich nicht um ein Duplikat: Im OP wird darum gebeten, den ersten Buchstaben einer Zeichenfolge groß zu schreiben, in der Frage im Link wird der erste Buchstabe jedes Wortes groß geschrieben.

2 Stimmen

@GvS: Die erste Antwort lautet sehr detailliert und der erste Code-Block ist genau wonach er sucht. Auch der Unterschied zwischen der Großschreibung aller Wörter und der Großschreibung nur des ersten Wortes ist nur eine Schleife.

2 Stimmen

Aber Sie sagten, und ich zitiere: "Machen Sie den ersten Buchstaben JEDES WORTES groß". Warum also "rotes Haus" --> "Rotes Haus"? Warum ist das "h" von "Haus" kein Großbuchstabe?

835voto

Carlos Muñoz Punkte 16622

Lösung in verschiedenen C#-Versionen

C# 8 mit mindestens .NET Core 3.0 oder .NET Standard 2.1

public static class StringExtensions
{
    public static string FirstCharToUpper(this string input) =>
        input switch
        {
            null => throw new ArgumentNullException(nameof(input)),
            "" => throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input)),
            _ => string.Concat(input[0].ToString().ToUpper(), input.AsSpan(1))
        };
}

Seit .NET Core 3.0 / .NET Standard 2.1 String.Concat() unterstützt ReadonlySpan<char> was eine Zuweisung spart, wenn wir .AsSpan(1) anstelle von .Substring(1) .

C# 8

public static class StringExtensions
{
    public static string FirstCharToUpper(this string input) =>
        input switch
        {
            null => throw new ArgumentNullException(nameof(input)),
            "" => throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input)),
            _ => input[0].ToString().ToUpper() + input.Substring(1)
        };
}

C# 7

public static class StringExtensions
{
    public static string FirstCharToUpper(this string input)
    {
        switch (input)
        {
            case null: throw new ArgumentNullException(nameof(input));
            case "": throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input));
            default: return input[0].ToString().ToUpper() + input.Substring(1);
        }
    }
}

Wirklich alte Antworten

public static string FirstCharToUpper(string input)
{
    if (String.IsNullOrEmpty(input))
        throw new ArgumentException("ARGH!");
    return input.First().ToString().ToUpper() + String.Join("", input.Skip(1));
}

Diese Version ist kürzer. Für eine schnellere Lösung schauen Sie sich bitte an Diegos Antwort .

public static string FirstCharToUpper(string input)
{
    if (String.IsNullOrEmpty(input))
        throw new ArgumentException("ARGH!");
    return input.First().ToString().ToUpper() + input.Substring(1);
}

Die wahrscheinlich schnellste Lösung ist Darren's (Es gibt sogar einen Benchmark), obwohl ich es ändern würde string.IsNullOrEmpty(s) Validierung eine Ausnahme auslösen, da die ursprüngliche Anforderung erwartet, dass ein erster Buchstabe vorhanden ist, damit er in Großbuchstaben geschrieben werden kann. Beachten Sie, dass dieser Code für eine generische Zeichenkette funktioniert und nicht speziell für gültige Werte aus der Textbox .

0 Stimmen

Warum nicht return String.Join(input.First().ToString().ToUpper(), input.Skip(1)); wenn Sie String.Join überhaupt verwenden wollen

2 Stimmen

Da der erste Parameter von String.Join ist das Trennzeichen, mit dem die mit dem zweiten Parameter angegebenen Zeichenketten verbunden werden sollen.

36 Stimmen

Ihre Antwort gefällt mir sehr, aber var arr = input.ToCharArray(); arr[0] = Char.ToUpperInvariant(arr[0]); return new String(arr); würde wahrscheinlich etwas an Geschwindigkeit gewinnen, da Sie weniger unveränderliche Objekte erstellen (und vor allem die String.Join ). Dies hängt natürlich von der Länge der Zeichenkette ab.

405voto

Diego Punkte 18573
public string FirstLetterToUpper(string str)
{
    if (str == null)
        return null;

    if (str.Length > 1)
        return char.ToUpper(str[0]) + str.Substring(1);

    return str.ToUpper();
}

Alte Antwort: Dadurch wird jeder Anfangsbuchstabe zu einem Großbuchstaben

public string ToTitleCase(string str)
{
    return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
}

0 Stimmen

Dabei wird jedoch jeder erste Buchstabe eines Wortes in Großbuchstaben umgewandelt, nicht nur das erste Zeichen einer Zeichenfolge.

0 Stimmen

@GvS, das ist es, worum Sie in der Frage gebeten werden.

26 Stimmen

Er fragt "Rotes Haus" => "Rotes Haus". Mit ToTitleCase erhalten Sie "Rotes Haus".

228voto

GPY Punkte 3532

Der richtige Weg ist der Einsatz von Kultur:

System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(word.ToLower())

Anmerkung: Dadurch wird jedes Wort innerhalb einer Zeichenfolge großgeschrieben, z. B. "rotes Haus" --> "Red House". Die Lösung schreibt auch innerhalb von Wörtern klein, z. B. "old McDonald" --> "Old Mcdonald".

29 Stimmen

Sechs Jahre, nachdem die Frage gestellt wurde, sollten Sie die folgenden Punkte gründlicher bearbeiten Lesen der vorhandenen Antworten und ihrer Kommentare . Wenn Sie überzeugt sind, dass Sie eine bessere Lösung haben, dann anzeigen die Situationen, in denen sich Ihre Antwort in einer Weise verhält, die Sie für überlegen halten, und insbesondere, wie sie sich von den bestehenden Antworten unterscheidet. 1) Equiso hat diese Option bereits in der zweiten Hälfte seiner Antwort behandelt. 2) Für viele Situationen, ToLower ist ein Fehler, da es die Großschreibung in der Mitte des Wortes auslöscht, z. B. "McDonalds". 3) Die Frage bezieht sich auf nur das erste Wort der Zeichenkette ändern , no über TitleCase.

2 Stimmen

Eine gute Kultur schadet sowieso nicht. Andere Betrachter haben vielleicht nicht die Anforderung "nur erster Buchstabe".

0 Stimmen

Eine ebenso korrekte Antwort wäre word.ToUpper() - damit wird der erste Buchstabe in Großbuchstaben umgewandelt, und um den Rest brauchen wir uns nicht zu kümmern.

94voto

Darren Punkte 7954

Ich habe die schnellste Methode aus C# Großbuchstaben Anfangsbuchstabe - Dot Net Perls und in eine Erweiterungsmethode umgewandelt:

    /// <summary>
    /// Returns the input string with the first character converted to uppercase, or mutates any nulls passed into string.Empty
    /// </summary>
    public static string FirstLetterToUpperCaseOrConvertNullToEmptyString(this string s)
    {
        if (string.IsNullOrEmpty(s))
            return string.Empty;

        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
    }

HINWEIS: Der Grund für die Verwendung von ToCharArray ist schneller als die Alternative char.ToUpper(s[0]) + s.Substring(1) ist, dass nur eine Zeichenkette zugewiesen wird, während die Substring Ansatz eine Zeichenkette für die Teilzeichenkette und dann eine zweite Zeichenkette, um das Endergebnis zusammenzusetzen.


So sieht dieser Ansatz in Kombination mit dem ersten Test aus Die akzeptierte Antwort von CarlosMuñoz :

    /// <summary>
    /// Returns the input string with the first character converted to uppercase
    /// </summary>
    public static string FirstLetterToUpperCase(this string s)
    {
        if (string.IsNullOrEmpty(s))
            throw new ArgumentException("There is no first letter");

        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
    }

0 Stimmen

Wow, danke, dass Sie Leistungskennzahlen gefunden haben, um eine Lösung mit überragender Leistung aufzuzeigen!

0 Stimmen

@ToolmakerSteve, ich mag diese Lösung, da sie in der Tat schneller zu sein scheint als andere, aber es gibt ein kleines Problem damit. Wenn Sie null übergeben, sollten Sie keinen leeren String als Ausgabe erhalten. In der Tat würde ich argumentieren, dass sogar die Übergabe einer leeren Zeichenkette eine Ausnahme auslösen sollte, da der OP nach dem 第一 Brief. Außerdem können Sie die Antworten anderer Personen kommentieren, bevor Sie sie bearbeiten.

2 Stimmen

@CarlosMuñoz - es wurde in der Metaebene diskutiert, ob man die Antworten anderer Leute "verbessern" sollte. Der Konsens war "wenn du eine Antwort verbessern kannst, dann tu es - niemand "besitzt" eine Antwort, nicht einmal der ursprüngliche Autor - das Ziel ist, die bestmöglichen Antworten zu haben". Es steht Ihnen natürlich frei, die Antwort zu bearbeiten oder die Bearbeitung rückgängig zu machen. In diesem Fall würde die Höflichkeit gebieten, dass die Version des ursprünglichen Autors das Endergebnis ist, und ich würde mich mit einem Kommentar zufrieden geben. Normalerweise auch die Änderung, die ich vornehme, in einen Kommentar schreiben; ich entschuldige mich, wenn ich das nicht getan habe.

53voto

Sie können die "ToTitleCase-Methode" verwenden:

string s = new CultureInfo("en-US").TextInfo.ToTitleCase("red house");
//result : Red House

Mit dieser Erweiterungsmethode werden alle Probleme mit Titelfällen gelöst.

Es ist einfach zu bedienen:

string str = "red house";
str.ToTitleCase();
//result : Red house

string str = "red house";
str.ToTitleCase(TitleCase.All);
//result : Red House

T Erweiterung Methode:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace Test
{
    public static class StringHelper
    {
        private static CultureInfo ci = new CultureInfo("en-US");
        //Convert all first latter
        public static string ToTitleCase(this string str)
        {
            str = str.ToLower();
            var strArray = str.Split(' ');
            if (strArray.Length > 1)
            {
                strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]);
                return string.Join(" ", strArray);
            }
            return ci.TextInfo.ToTitleCase(str);
        }

        public static string ToTitleCase(this string str, TitleCase tcase)
        {
            str = str.ToLower();
            switch (tcase)
            {
                case TitleCase.First:
                    var strArray = str.Split(' ');
                    if (strArray.Length > 1)
                    {
                        strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]);
                        return string.Join(" ", strArray);
                    }
                    break;
                case TitleCase.All:
                    return ci.TextInfo.ToTitleCase(str);
                default:
                    break;
            }
            return ci.TextInfo.ToTitleCase(str);
        }
    }

    public enum TitleCase
    {
        First,
        All
    }
}

2 Stimmen

Das Problem bei Ihrer Lösung ist, dass "Rotes Haus" in "Rotes Haus" umgewandelt wird und nicht in "Rotes Haus", wie es in der Frage verlangt wurde.

5 Stimmen

@Tacttin Es wird funktionieren, aber der folgende Code ist einfacher zu lesen und funktioniert besser char.ToUpper(text[0]) + ((text.Length > 1) ? text.Substring(1).ToLower() : string.Empty); Sie können mehr lesen @ vkreynin.wordpress.com/2013/10/09/

2 Stimmen

Diese Lösung gefällt mir nicht, weil sie zwei ganz unterschiedliche Situationen in einer einzigen langwierigen Methode vereint. Ich sehe auch keinen konzeptionellen Nutzen. Und die Umsetzung, nur den ersten Buchstaben groß zu schreiben, ist lächerlich. Wenn man den ersten Buchstaben großschreiben will, ist die naheliegende Implementierung nur den ersten Buchstaben groß zu schreiben (ToUpper) . Stattdessen würde ich zwei getrennte Methoden haben. FirstLetterToUpper in der Antwort von Equiso (oder in der neueren Antwort von Guillernet), und ToTitleCase hier, aber ohne den zweiten Parameter. Dann brauchen Sie nicht enum TitleCase .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X