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

Dies funktioniert auch, wenn Sie Take, Skip und Aggregate verwenden:

    public static string FirstCharToUpper(this string text) 
    {
      if (String.IsNullOrEmpty(text)) return String.Empty;
      var first = text.Take(1).ToArray()[0].ToString().ToUpper();
      var rest = text.Skip(1).Aggregate("", ((xs, x) => xs + x));
      return first + rest;
    }

-1voto

Grimm Punkte 612

Vor kurzem hatte ich eine ähnliche Anforderung und erinnerte mich daran, dass die LINQ-Funktion Select() einen Index bereitstellt:

string input;
string output;

input = "red house";
output = String.Concat(input.Select((currentChar, index) => index == 0 ? Char.ToUpper(currentChar) : currentChar));
//output = "Red house"

Da ich das sehr oft brauche, habe ich eine Erweiterungsmethode für den String-Typ erstellt:

public static class StringExtensions
{
    public static string FirstLetterToUpper(this string input)
    {
        if (string.IsNullOrEmpty(input))
            return string.Empty;
        return String.Concat(input.Select((currentChar, index) => index == 0 ? Char.ToUpper(currentChar) : currentChar));
    }
}

Bitte beachten Sie, dass nur der erste Buchstabe in Großbuchstaben umgewandelt wird - alle anderen Zeichen bleiben unberührt. Wenn Sie die anderen Zeichen in Kleinbuchstaben umwandeln möchten, können Sie auch Char.ToLower(currentChar) für index > 0 aufrufen oder ToLower() für die gesamte Zeichenkette aufrufen.

Hinsichtlich der Leistung habe ich den Code mit der Lösung von Darren verglichen. Auf meinem Rechner Darrens Code ist etwa doppelt so schnell, was nicht weiter verwunderlich ist, da er nur den ersten Buchstaben innerhalb eines Zeichenarrays direkt bearbeitet.

Ich schlage also vor, dass Sie Darrens Code verwenden, wenn Sie die schnellste verfügbare Lösung benötigen. Wenn Sie auch andere Zeichenkettenmanipulationen integrieren wollen, kann es praktisch sein, die Ausdruckskraft einer Lambda-Funktion zu haben, die die Zeichen der Eingabezeichenkette berührt - Sie können diese Funktion leicht erweitern - daher lasse ich diese Lösung hier.

1 Stimmen

Ich habe mich gefragt, wie ich dieses Problem lösen könnte, habe meine eigene Lösung ausgearbeitet und bin dann zurückgekommen, um sie zu posten, nur um festzustellen, dass Sie genau dieselbe Lösung gefunden haben, die ich bereits hatte. +1 für Sie!

-2voto

Verwenden Sie den folgenden Code:

string strtest ="PRASHANT";
strtest.First().ToString().ToUpper() + strtest.Remove(0, 1).ToLower();

1 Stimmen

Es ist mir nicht einmal einen Punkt wert, um diese Antwort, die Jahre später hinzugefügt wurde und offensichtlich gleichwertig mit bereits vorhandenen Antworten ist, herunterzustufen. Wenn Sie eine neue Antwort zu einer Frage mit vielen Antworten hinzufügen wollen, erklären Sie bitte was Sie für überlegen halten über Ihre Antwort, oder unter welchen Umständen Ihre Antwort wäre nützlicher als andere Antworten. Seien Sie konkret.

-2voto

Saad Khalid Punkte 78

Der einfachste Weg zu aktivieren. der erste Buchstabe ist:

  1. Mit System.Globalization;

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

4 Stimmen

Diese Antwort ist im Wesentlichen identisch mit den Antworten, die Jahre früher. Es trägt nichts zur Diskussion bei.

3 Stimmen

Es ist auch falsch, genau wie der Kommentar in dem anderen, das macht jeden ersten Buchstaben in allen Wörtern groß nicht z.B. Rotes Haus statt Rotes Haus.

-2voto

thattolleyguy Punkte 785

Dabei wird der erste Buchstabe und jeder Buchstabe nach einem Leerzeichen großgeschrieben und alle anderen Buchstaben kleingeschrieben.

public string CapitalizeFirstLetterAfterSpace(string input)
{
    System.Text.StringBuilder sb = new System.Text.StringBuilder(input);
    bool capitalizeNextLetter = true;
    for(int pos = 0; pos < sb.Length; pos++)
    {
        if(capitalizeNextLetter)
        {
            sb[pos]=System.Char.ToUpper(sb[pos]);
            capitalizeNextLetter = false;
        }
        else
        {
            sb[pos]=System.Char.ToLower(sb[pos]);
        }

        if(sb[pos]=' ')
        {
            capitalizeNextLetter=true;
        }
    }
}

2 Stimmen

Oder, wenn Sie nicht viel Code schreiben wollen: CultureInfo.CurrentCulture.TextInfo.ToTitleCase(theString); bewirkt das Gleiche.

0 Stimmen

Ja... das wusste ich nicht :) Und aufgrund meiner massiven Menge an Code, tauchten die Antworten der anderen schon auf, während ich noch tippte.

1 Stimmen

AUFGEWÄHLT: 1) Ein kleiner Unterschied zwischen dieser Antwort und ToTitleCase besteht darin, dass diese Antwort Wörter, die in Großbuchstaben geschrieben sind, in TitleCase umwandelt, während ToTitleCase solche Wörter in Ruhe lässt (in der Annahme, dass es sich um Akronyme handeln könnte). Dies kann, muss aber nicht das sein, was gewünscht wird. Der Vorteil eines solchen Beispielcodes ist, dass er nach Belieben geändert werden kann. 2) dies wird nicht korrekt mit Leerzeichen außer ' ' umgehen. sollte Leerzeichen-Test mit Leerzeichen-Test ersetzen.

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