Mam znak „ DetailsView
a” TextBox
i chcę, aby dane wejściowe były zapisywane zawsze z PIERWSZYM LITEREM W KAPITALE.
Przykład:
"red" --> "Red"
"red house" --> " Red house"
Jak mogę osiągnąć maksymalizację wydajności ?
UWAGA :
W oparciu o odpowiedzi i komentarze pod odpowiedziami wiele osób uważa, że chodzi tu o wielkie litery wszystkich słów w ciągu. Np => Red House
ona nie jest, ale jeśli to jest to, czego szukać , szukać jednej z odpowiedzi, które używa TextInfo
„s ToTitleCase
metod. (UWAGA: Odpowiedzi te są niepoprawne dla faktycznie zadanego pytania.)
Zobacz doktrynę TextInfo.ToTitleCase, aby uzyskać zastrzeżenia (nie dotyka słów wielkimi literami - są uważane za akronimy; mogą zawierać małe litery w środku słów, które „nie powinny” być obniżony, np. „McDonald” => „Mcdonald”; nie ma gwarancji, że poradzi sobie z wszystkimi regułami rekapitalizacji dla określonych subtelności).
UWAGA :
Pytanie jest dwuznaczne, czy litery po pierwszej powinny być zmuszone do małych liter . Przyjęta odpowiedź zakłada, że należy zmienić tylko pierwszą literę . Jeśli chcesz wymusić, aby wszystkie litery w łańcuchu oprócz pierwszej były pisane małymi literami, poszukaj odpowiedzi zawierającej ToLower
, a nie zawierającej ToTitleCase .
źródło
Odpowiedzi:
Zaktualizowano do C # 8
C # 7
Naprawdę stare odpowiedzi
EDYCJA : Ta wersja jest krótsza. Aby uzyskać szybsze rozwiązanie, spójrz na odpowiedź Equiso
EDYCJA 2 : Prawdopodobnie najszybszym rozwiązaniem jest rozwiązanie Darrena (istnieje nawet test porównawczy), chociaż zmieniłbym jego
string.IsNullOrEmpty(s)
walidację, aby zgłosić wyjątek, ponieważ pierwotne wymaganie przewiduje istnienie pierwszej litery, aby można ją było pisać dużymi literami. Zauważ, że ten kod działa na ogólny ciąg, a nie szczególnie na prawidłowe wartości zTextbox
.źródło
String.Join
jest separatorem, za pomocą którego można łączyć ciągi podane z drugim parametrem.var arr = input.ToCharArray(); arr[0] = Char.ToUpperInvariant(arr[0]); return new String(arr);
prawdopodobnie zyskałbym trochę prędkości, ponieważ tworzysz mniej niezmienne obiekty (a zwłaszcza pomijaszString.Join
). To oczywiście zależy od długości sznurka."Argh!"
aby zachować zasadę wielkiej litery . ;)Stara odpowiedź: powoduje to, że każda pierwsza litera jest pisana wielkimi literami
źródło
Właściwy sposób to użycie Kultury:
Uwaga: Spowoduje to wielkie litery każdego słowa w ciągu, np. „Czerwony dom” -> „czerwony dom”. Rozwiązanie to będzie także używać wielkich liter w słowach, np. „Stary McDonald” -> „stary Mcdonald”.
źródło
ToLower
jest błędem, ponieważ usuwa duże litery w środku słowa, np. „McDonalds”. 3) Pytanie dotyczy zmiany tylko pierwszego słowa ciągu , a nie tytułu.Wybrałem najszybszą metodę z http://www.dotnetperls.com/uppercase-first-letter i przekonwertowałem na metodę rozszerzenia:
UWAGA: Powodem użycia
ToCharArray
jest szybszy niż alternatywachar.ToUpper(s[0]) + s.Substring(1)
, ponieważ przydzielany jest tylko jeden ciąg, podczas gdySubstring
podejście przydziela ciąg dla podłańcucha, a następnie drugi ciąg, aby skomponować wynik końcowy.EDYCJA : Oto jak to podejście wygląda w połączeniu ze wstępnym testem zaakceptowanym przez CarlosMuñoz :
źródło
return string.Empty
tutaj ukryłoby się „złe” wywołanie metody.Możesz użyć „metody ToTitleCase”
ta metoda rozszerzenia rozwiązuje każdy problem z tytułem.
łatwy w użyciu
metoda rozszerzenia
źródło
FirstLetterToUpper
w odpowiedzi Equiso (lub w nowszej odpowiedzi Guillerneta) iToTitleCase
tutaj, ale bez drugiego parametru. Więc nie potrzebujeszenum TitleCase
.Dla pierwszej litery ze sprawdzaniem błędów:
A oto to samo, co przydatne rozszerzenie
źródło
źródło
Jeśli problemem jest użycie wydajności / pamięci, ten tworzy tylko jeden (1) StringBuilder i jeden (1) nowy Ciąg o tym samym rozmiarze co Ciąg Oryginalny.
źródło
char[]
a nie całej infrastrukturyStringBuilder
. Zamiastnew StringBuilder(str)
, użyjstr.ToCharArray()
i zamiastsb.ToString()
, użyjnew string(charArray)
.StringBuilder
emuluje rodzaj indeksowania, który tablica znaków odsłania natywnie, więc rzeczywista.ToUpper
linia może być zasadniczo taka sama. :-)ToCharArray
, zgodnie z sugestią @JonathanGilbertNajszybsza metoda.
Testy pokazują kolejne wyniki (ciąg znaków z wejściowymi symbolami 10000000): Wyniki testu
źródło
s
parametru, gdy jest pusty lub pusty.Spróbuj tego:
źródło
Jeśli zależy Ci tylko na pisaniu wielkiej litery i nie ma znaczenia reszta ciągu, możesz po prostu wybrać pierwszy znak, ustawić wielkie litery i połączyć go z resztą ciągu bez oryginalnego pierwszego znaku.
Musimy przekonwertować pierwszy znak na ToString (), ponieważ odczytujemy go jako tablicę Char, a typ Char nie ma metody ToUpper ().
źródło
Oto sposób, aby to zrobić jako metodę rozszerzenia:
Można wtedy nazwać:
A oto kilka testów jednostkowych:
źródło
string.Format
to przesada; po prostu zróbtext.Substring(0, 1).ToUpper() + text.Substring(1)
.Ponieważ akurat nad tym pracowałem i szukałem pomysłów, oto rozwiązanie, do którego doszedłem. Używa LINQ i będzie w stanie zapisać wielką literę ciągu, nawet jeśli pierwsze wystąpienie nie jest literą. Oto metoda rozszerzenia, którą ostatecznie opracowałem.
Jestem pewien, że istnieje sposób, aby to trochę zoptymalizować lub oczyścić.
źródło
Znalazłem coś tutaj http://www.dotnetperls.com/uppercase-first-letter :
może to pomaga !!
źródło
Sprawdź, czy łańcuch nie jest pusty, a następnie przekonwertuj pierwszy znak na wielkie litery, a resztę na małe:
źródło
To zrobi, chociaż upewni się również, że nie ma błędnych liter, które nie byłyby na początku słowa.
źródło
s
przed wywołaniem ToTitleCase.Wydaje się, że jest tutaj dużo złożoności, gdy wszystko, czego potrzebujesz, to:
Godne uwagi punkty:
Jest to metoda rozszerzenia.
Jeśli dane wejściowe są puste, puste lub spacja, dane wejściowe są zwracane w niezmienionej postaci.
String.IsNullOrWhiteSpace został wprowadzony w .NET Framework 4. To nie będzie działać ze starszymi frameworkami.
źródło
IsNullOrWhiteSpace
zamiastIsNullOrEmpty
, to jeśli masz zamiar znaleźć i zmienić pierwszy nieprzestrzegania biała przestrzeń . Ale ty nie - zawsze działaszs[0]
. Jest więc bezużyteczny [zarówno semantycznie, jak i wydajności] w użyciuIsNullOrWhiteSpace
.IsNullOrWhiteSpace
mnie niepokoi, że niedbały czytelnik może pomyśleć: „Sprawdził, czy nie ma białych znaków, więc poniższy kod naprawdę znajduje i zmienia literę, nawet jeśli poprzedza ją biała spacja”. Ponieważ kod nie zmieni pierwszej „litery” poprzedzonej spacją, użycieIsNullOrWhiteSpace
może wprowadzić w błąd tylko czytelnika.źródło
String
może być czymkolwiekUpper
lub. więcLower
jest to ogólne rozwiązanie dla całego łańcucha.Join
zamiastemp.First().ToString().ToUpper() + emp.Substring(1);
? Prawdopodobnie trzeba być bardziej defensywny też:output = string.IsNullOrEmpty(emp) ? string.Empty : [...]
. Ponadto, fwiw, zgódź się z @ CarlosMuñoz - nie potrzebujesz odpowiedziToLower()
na pytanie PO.Substring
to również dobry styl pisania kodu, zgadzam się na twoje rozwiązanie przycinania kodu, ale w tym przypadku pisanieToLower()
jest dobrą praktyką programistyczną.string
może być cokolwiek WUpper
przypadku, gdyLower
sprawa zależy od danych wejściowych użytkownika, podaję ogólne rozwiązanie.Chciałem udzielić odpowiedzi „MAKSYMALNA WYDAJNOŚĆ”. Moim zdaniem odpowiedź „MAKSYMALNA WYDAJNOŚĆ” obejmuje wszystkie scenariusze i zapewnia odpowiedź na pytanie uwzględniające te scenariusze. Oto moja odpowiedź. Z tych powodów:
Podanie ich jako parametrów opcjonalnych sprawia, że ta metoda jest w pełni wielokrotnego użytku, bez konieczności wpisywania wybranej kultury za każdym razem.
źródło
Ostatnio miałem podobne wymaganie i pamiętałem, że funkcja LINQ Select () zapewnia indeks:
Ponieważ potrzebuję tego bardzo często, stworzyłem metodę rozszerzenia dla typu ciągu:
Pamiętaj, że tylko pierwsza litera jest konwertowana na wielkie litery - wszystkie pozostałe znaki nie są dotykane. Jeśli potrzebujesz, aby pozostałe znaki były pisane małymi literami, możesz także wywołać Char.ToLower (currentChar) dla indeksu> 0 lub wywołać ToLower () na całym ciągu.
Jeśli chodzi o wydajność, porównałem kod z rozwiązaniem Darrena. Na mojej maszynie kod Darrena jest około 2 razy szybszy, co nie jest zaskoczeniem, ponieważ bezpośrednio edytuje tylko pierwszą literę w tablicy znaków. Proponuję więc wziąć kod Darrena, jeśli potrzebujesz najszybszego dostępnego rozwiązania. Jeśli chcesz zintegrować również inne manipulacje ciągami znaków, może być wygodne, aby ekspresyjna moc funkcji lambda dotykała znaków ciągu wejściowego - możesz łatwo rozszerzyć tę funkcję - więc zostawiam to rozwiązanie tutaj.
źródło
Myślę, że poniższa metoda jest najlepszym rozwiązaniem
ref
źródło
Ponieważ pytanie dotyczy maksymalizacji wydajności , zaadaptowałem wersję Darrena do
Span
s, która redukuje śmieci i poprawia prędkość o około 10%.Wydajność
Pełny kod testowy
Edycja: Wystąpiła literówka, zamiast s [0], było [0] - to skutkuje spłaszczeniem tej samej, pustej wartości do przydzielonego zakresu a.
źródło
W ten sposób pierwsza litera i każda litera następująca po spacji i małe litery są pisane wielką literą.
źródło
Użyj następującego kodu:
źródło
Wygląda na to, że żadne z podanych tutaj rozwiązań nie zajmie się białą spacją przed ciągiem.
Dodając to jako myśl:
Powinien obsłużyć
this won't work on other answers
(to zdanie ma spację na początku), a jeśli nie podoba ci się przycinanie spacji, po prostu przekażfalse
jako drugi parametr (lub zmień wartość domyślną nafalse
i podaj,true
jeśli chcesz zajmować się spacją)źródło
FluentSharp ma
lowerCaseFirstLetter
metodę, która to robihttps://github.com/o2platform/FluentSharp/blob/700dc35759db8e2164771a71f73a801aa9379074/FluentSharp.CoreLib/ExtensionMethods/System/String_ExtensionMethods.cs#L575
źródło
Najłatwiejszym sposobem na pisanie wielkich liter jest:
1- Korzystanie z Sytem.Globalization;
`
źródło
następująca funkcja jest poprawna na wszystkie sposoby:
Znalazłem to tutaj
źródło
char.IsWhiteSpace( array[ i -1 ] )
zamiast.. == ' '
, aby obsłużyć całą białą przestrzeń. 2) usuń dwa miejsca, które to robiąif (char.isLower(..))
- nie służą one celowi.ToUpper
po prostu nic nie robi, jeśli postać nie ma małych liter.Rozwijając powyższe pytanie Carlosa, jeśli chcesz użyć wielu zdań, możesz użyć tego kodu:
źródło
Możliwe rozwiązanie problemu.
źródło