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?

1voto

D.JCode Punkte 388

Ich denke, dass die folgende Methode die beste Lösung ist.

class Program
{
    static string UppercaseWords(string value)
    {
        char[] array = value.ToCharArray();
        // Handle the first letter in the string.
        if (array.Length >= 1)
        {
            if (char.IsLower(array[0]))
            {
                array[0] = char.ToUpper(array[0]);
            }
        }
        // Scan through the letters, checking for spaces.
        // ... Uppercase the lowercase letters following spaces.
        for (int i = 1; i < array.Length; i++)
        {
            if (array[i - 1] == ' ')
            {
                if (char.IsLower(array[i]))
                {
                    array[i] = char.ToUpper(array[i]);
                }
            }
        }
        return new string(array);
    }

    static void Main()
    {
        // Uppercase words in these strings.
        const string value1 = "something in the way";
        const string value2 = "dot net PERLS";
        const string value3 = "String_two;three";
        const string value4 = " sam";
        // ... Compute the uppercase strings.
        Console.WriteLine(UppercaseWords(value1));
        Console.WriteLine(UppercaseWords(value2));
        Console.WriteLine(UppercaseWords(value3));
        Console.WriteLine(UppercaseWords(value4));
    }
}

Output

Something In The Way
Dot Net PERLS
String_two;three
 Sam

Referenz

1voto

Patrick Knott Punkte 1278

Ich wollte eine "maximale Leistung" Antwort. Meiner Meinung nach ist eine "maximale Leistung" Antwort erfasst alle Szenarien und liefert die Antwort auf die Frage, die diese Szenarien berücksichtigt. Also, hier ist meine Antwort. Mit diesen Gründen:

  1. IsNullOrWhiteSpace berücksichtigt Zeichenketten, die nur aus Leerzeichen oder Null/Leerzeichen bestehen.

  2. .Trim() entfernt Leerzeichen am Anfang und Ende der Zeichenkette.

  3. .First() nimmt das erste Element einer IEnumerable<TSource> (oder String).

  4. Wir sollten prüfen, ob es sich um einen Buchstaben handelt, der großgeschrieben werden kann/sollte.

  5. Der Rest der Zeichenkette wird nur dann hinzugefügt, wenn die Länge dies erfordert.

  6. Nach der bewährten .NET-Praxis sollten wir eine Kultur unter System.Globalization.CultureInfo bereitstellen.

  7. Da sie als optionale Parameter zur Verfügung stehen, ist diese Methode vollständig wiederverwendbar, ohne dass die gewählte Kultur jedes Mal neu eingegeben werden muss.

  8. Mir ist auch aufgefallen, dass meine und die meisten dieser Antworten das Leerzeichen am Anfang der Zeichenkette nicht beibehalten haben. Hier wird auch gezeigt, wie man dieses Leerzeichen beibehält.

    //Capitalize the first letter disregard all chars using regex.
    public static string RegCapString(this string instring, string culture = "en-US", bool useSystem = false)
    {
        if (string.IsNullOrWhiteSpace(instring))
        {
            return instring;
        }
        var m = Regex.Match(instring, "[A-Za-z]").Index;
        return instring.Substring(0, m) + instring[m].ToString().ToUpper(new CultureInfo(culture, useSystem)) + instring.Substring(m + 1);
    }
    //Capitalize first char if it is a letter disregard white space.
    public static string CapString(this string instring, string culture = "en-US", bool useSystem = false)
    {
        if (string.IsNullOrWhiteSpace(instring) ||
           !char.IsLetter(instring.Trim().First()))
        {
            return instring;
        }
        var whiteSpaces = instring.Length - instring.TrimStart().Length;
        return (new string(' ', whiteSpaces)) + 
            instring.Trim().First().ToString().ToUpper(new CultureInfo(culture, useSystem)) + 
            ((instring.TrimStart().Length > 1) ? instring.Substring(whiteSpaces + 1) : "");
    }

3 Stimmen

Dies deckt zwar die meisten Fälle ab, aber wäre es nicht ziemlich langsam, wenn man bedenkt, wie viele Zeichenketten bei jedem Vorgang erstellt werden? Es gibt eine Tonne von String-Zuweisung geht hier auf. Vorzugsweise wäre es einmal zugewiesen werden, und nur einmal.

0 Stimmen

"ienumerable" scheint nicht richtig zu sein. Wird es nicht anders geschrieben?

0 Stimmen

Entschuldigung, @PeterMortensen ja, es ist richtig, wenn es groß geschrieben wird, sieht es richtig aus.

1voto

TheComputerWizard Punkte 142

Hier ist der Code, der bei mir funktioniert hat:

private string StringLetterUppercase(string input)
{
    if (input == null)
    {
        throw new ArgumentNullException(nameof(input));
    }
    else if (input == "")
    {
        throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input));
    }
    else
    {
        return input.First().ToString().ToUpper() + input.Substring(1);
    }
}

1voto

Anonymous Punkte 41

Dies ist der schnellste Weg:

public static unsafe void ToUpperFirst(this string str)
{
    if (str == null)
        return;
    fixed (char* ptr = str)
        *ptr = char.ToUpper(*ptr);
}

Ohne die ursprüngliche Zeichenfolge zu ändern:

public static unsafe string ToUpperFirst(this string str)
{
    if (str == null)
        return null;
    string ret = string.Copy(str);
    fixed (char* ptr = ret)
        *ptr = char.ToUpper(*ptr);
    return ret;
}

0 Stimmen

Willkommen bei Stack Overflow! Dieser Code kann zwar die Frage beantworten, aber es wäre besser, etwas Kontext einzubauen und zu erklären, wie es funktioniert. In der letzten Zeile ist eine Menge los. Warum führt dies zu einer maximalen Leistung?

0 Stimmen

@ryanyuyu dieser Weg ist am schnellsten, weil: 1) Nur ein Funktionsaufruf ( char.ToUpper() ) 2) Es ist eine Änderung der ursprünglichen Zeichenkette, ohne drei oder mehr unnötige Zeichenketten zu erstellen, wie in anderen Antworten

0 Stimmen

Es ist wahrscheinlich ziemlich schnell, aber es ist unsicher und nicht nur, weil es das Schlüsselwort "unsafe" verwendet. Angenommen, Sie haben mehrere String-Variablen mit demselben String-Wert darin und verwenden dies, um einen der Strings zu ändern, dann werden alle Strings geändert, d.h. var a = "hello"; var b = "hello; a.ToUpperFirst() werden Sie feststellen, dass der Wert b ebenfalls geändert wurde.

1voto

Shailesh Punkte 940
string emp="TENDULKAR";
string output;
output=emp.First().ToString().ToUpper() + String.Join("", emp.Skip(1)).ToLower();

0 Stimmen

Warum ToLower() am Ende?. Es gibt keine Anforderung für andere Buchstaben als den ersten.

0 Stimmen

String ist, kann alles sein Upper o Lower .also eine generische Lösung für alle Zeichenfolgen.

0 Stimmen

Warum Join 代わりに emp.First().ToString().ToUpper() + emp.Substring(1); ? Wahrscheinlich müssen wir auch defensiver werden: output = string.IsNullOrEmpty(emp) ? string.Empty : [...] . Übrigens stimme ich @CarlosMuñoz zu - Sie brauchen die ToLower() für die Frage des Auftraggebers.

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