У меня есть DetailsView
с, TextBox
и я хочу, чтобы входные данные были сохранены всегда с первой буквой КАПИТАЛА.
Пример:
"red" --> "Red"
"red house" --> " Red house"
Как я могу достичь этой максимальной производительности ?
ПРИМЕЧАНИЕ .
Исходя из ответов и комментариев к ответам, многие люди думают, что это вопрос об использовании всех слов в строке. Например , => Red House
это не так , но если это то , что вы ищете , посмотрите на один из ответов , которые использует TextInfo
«ы ToTitleCase
метод. (ПРИМЕЧАНИЕ. Эти ответы неверны для фактически заданного вопроса.)
См. Документ TextInfo.ToTitleCase для предостережений (не затрагивает все заглавные буквы - они считаются аббревиатурами; могут быть строчные буквы в середине слов, которые «не должны» быть понижено, например, "McDonald" => "Mcdonald"; не гарантировано обрабатывать все специфические для культуры тонкости правил капитализации.)
ПРИМЕЧАНИЕ :
Вопрос в том , неоднозначном , является ли письма после того , как первый должны быть вынуждены к нижнему регистру . Принятый ответ предполагает, что только первая буква должна быть изменена . Если вы хотите, чтобы все буквы в строке, кроме первой, были строчными, найдите ответ, содержащий ToLower
, а не содержащий ToTitleCase .
источник
Ответы:
Обновлено до C # 8
C # 7
Действительно старые ответы
РЕДАКТИРОВАТЬ : эта версия короче. Для более быстрого решения взгляните на ответ Equiso
РЕДАКТИРОВАТЬ 2 : Вероятно, самым быстрым решением является решение Даррена (есть даже эталон), хотя я бы изменил его
string.IsNullOrEmpty(s)
валидацию на исключение, так как исходное требование предполагает существование первой буквы, чтобы ее можно было вводить прописными буквами. Обратите внимание, что этот код работает для общей строки, а не только для допустимых значений изTextbox
.источник
String.Join
- это разделитель, с которым соединяются строки, заданные вторым параметром.var arr = input.ToCharArray(); arr[0] = Char.ToUpperInvariant(arr[0]); return new String(arr);
, вероятно, вы получите некоторую скорость, поскольку вы создаете менее неизменные объекты (и особенно вы пропускаетеString.Join
). Это, конечно, зависит от длины строки."Argh!"
чтобы соответствовать правилу прописной буквы . ;)Старый ответ: это делает каждое первое письмо в верхнем регистре
источник
Правильный путь заключается в использовании культуры:
Примечание: это будет использовать каждое слово в строке, например, «красный дом» -> «красный дом». Решение также будет использовать прописные буквы в словах, например «старый Макдональд» -> «старый Макдональд».
источник
ToLower
это ошибка, так как она уничтожает заглавные буквы в середине слова, например «Макдональдс». 3) Вопрос об изменении только первого слова строки , а не о TitleCase.Я взял самый быстрый метод с http://www.dotnetperls.com/uppercase-first-letter и перешел на метод расширения:
ПРИМЕЧАНИЕ. Причина, по которой используется
ToCharArray
быстрее, чем альтернативаchar.ToUpper(s[0]) + s.Substring(1)
, заключается в том, что выделяется только одна строка, в то время какSubstring
подход выделяет строку для подстроки, а затем вторую строку для составления окончательного результата.РЕДАКТИРОВАТЬ : Вот как выглядит этот подход, в сочетании с первоначальным тестом CarlosMuñoz принятый ответ :
источник
return string.Empty
здесь будет скрываться «плохой» вызов метода.Вы можете использовать «метод ToTitleCase»
этот метод расширения решает все проблемы заглавных букв.
прост в использовании
Метод расширения
источник
FirstLetterToUpper
в ответе Equiso (или в более новом ответе Guillernet) иToTitleCase
здесь, но без второго параметра. Тогда не нужноenum TitleCase
.Для первой буквы с проверкой ошибок:
И вот так же, как удобное расширение
источник
источник
Если производительность / использование памяти является проблемой, тогда создается только одна (1) строка StringBuilder и одна (1) новая строка того же размера, что и строка оригинала.
источник
char[]
а не наличия всей инфраструктурыStringBuilder
. Вместо тогоnew StringBuilder(str)
, чтобы использоватьstr.ToCharArray()
, и вместо тогоsb.ToString()
, чтобы использоватьnew string(charArray)
.StringBuilder
эмулирует тип индексации, который массив символов предоставляет изначально, поэтому фактическая.ToUpper
строка может быть практически одинаковой. :-)ToCharArray
, как это было предложено @JonathanGilbertСамый быстрый метод.
Тесты показывают следующие результаты (строка с 10000000 символов в качестве входных данных): Результаты теста
источник
s
параметр, когда ноль или пусто.Попробуй это:
источник
Если вас волнует только то, что первая буква пишется с заглавной буквы, а остальная часть строки не имеет значения, вы можете просто выбрать первый символ, сделать его заглавным и объединить его с остальной частью строки без исходного первого символа.
Нам нужно преобразовать первый символ ToString (), потому что мы читаем его как массив Char, а тип Char не имеет метода ToUpper ().
источник
Вот способ сделать это как метод расширения:
Тогда можно назвать как:
И вот некоторые модульные тесты для этого:
источник
string.Format
перебор; просто делайtext.Substring(0, 1).ToUpper() + text.Substring(1)
.Так как мне довелось работать над этим, и я искал какие-то идеи, к этому решению я пришел. Он использует LINQ и сможет использовать заглавные буквы первой строки, даже если первое вхождение не является буквой. Вот метод расширения, который я закончил.
Я уверен, что есть способ немного оптимизировать или очистить это.
источник
Я нашел кое-что здесь http://www.dotnetperls.com/uppercase-first-letter :
может это поможет !!
источник
Убедитесь, что строка не пуста, затем преобразуйте первый символ в верхний регистр, а остальные - в нижний регистр:
источник
Это будет сделано, хотя и будет следить за тем, чтобы не было ошибочных заглавных букв в начале слова.
источник
s
Нужна нулевая проверка перед вызовом ToTitleCase.Кажется, здесь много сложностей, когда все, что вам нужно, это:
Интересные моменты:
Это метод расширения.
Если входное значение пустое или пустое, входное значение возвращается как есть.
String.IsNullOrWhiteSpace был представлен в .NET Framework 4. Это не будет работать со старыми платформами.
источник
IsNullOrWhiteSpace
, чемIsNullOrEmpty
, если вы собираетесь найти и изменить первое пустое пространство . Но вы не - вы всегда оперируетеs[0]
. Так что его бессмысленно [и семантически, и производительности] использоватьIsNullOrWhiteSpace
.IsNullOrWhiteSpace
меня беспокоит такое использование, потому что неосторожный читатель может подумать: «Он проверил наличие пробела, поэтому следующий код действительно находит и меняет букву, даже если ей предшествует пробел». Поскольку ваш код не сможет изменить «первую» букву, которой предшествует пробел, использованиеIsNullOrWhiteSpace
может ввести в заблуждение только читателя.источник
String
Это может быть что угодно,Upper
или. Так чтоLower
это общее решение для всей строки.Join
вместоemp.First().ToString().ToUpper() + emp.Substring(1);
? Наверное, нужно быть более оборонительнымoutput = string.IsNullOrEmpty(emp) ? string.Empty : [...]
. Кроме того, согласитесь с @ CarlosMuñoz - вам не нуженToLower()
вопрос ОП.Substring
также является хорошим стилем написания кода, я согласен с вашим решением обрезать код, но в этом случае написаниеToLower()
- хорошая практика программирования.string
может быть что угодно ВUpper
случае, еслиLower
случай зависит от ввода пользователя, я даю общее решение.Я хотел дать ответ «МАКСИМАЛЬНАЯ ЭФФЕКТИВНОСТЬ». На мой взгляд, ответ «МАКСИМАЛЬНАЯ ЭФФЕКТИВНОСТЬ» охватывает все сценарии и дает ответ на вопрос с учетом этих сценариев. Итак, вот мой ответ. По этим причинам:
Предоставление их в качестве необязательных параметров делает этот метод полностью пригодным для повторного использования без необходимости каждый раз вводить выбранную культуру.
источник
Недавно у меня было похожее требование, и я вспомнил, что функция LINQ Select () предоставляет индекс:
Поскольку мне это нужно очень часто, я сделал метод расширения для строкового типа:
Обратите внимание, что только первая буква преобразуется в верхний регистр - все остальные символы не затрагиваются. Если вам нужны другие символы в нижнем регистре, вы также можете вызвать Char.ToLower (currentChar) для index> 0 или вызвать ToLower () для всей строки в первую очередь.
Что касается производительности, я сравнил код с решением от Darren. На моей машине код Даррена примерно в 2 раза быстрее, что неудивительно, поскольку он напрямую редактирует только первую букву в массиве символов. Поэтому я предлагаю вам взять код Даррена, если вам нужно самое быстрое из доступных решений. Если вы хотите интегрировать и другие манипуляции со строками, может быть удобно, чтобы выразительная сила лямбда-функции касалась символов входной строки - вы можете легко расширить эту функцию - поэтому я оставлю это решение здесь.
источник
Я думаю, что метод ниже является лучшим решением
ссылка
источник
Поскольку этот вопрос касается максимизации производительности, я принял версию Даррена для использования
Span
s, которая уменьшает мусор и повышает скорость примерно на 10%.Представление
Полный тестовый код
Редактировать: было типо, вместо s [0], было [0] - это приводит к тому, что купирование совпадает с пустым значением выделенного диапазона a.
источник
Это заглавная буква первая и каждая буква после пробела и строчные буквы любой другой буквы.
источник
Используйте следующий код:
источник
Похоже, что ни одно из приведенных здесь решений не будет иметь дело с пробелом перед строкой.
Просто добавив это как мысль:
Он должен обрабатывать
this won't work on other answers
(это предложение имеет пробел в начале), и если вам не нравится обрезка пробела, просто передайтеfalse
качестве второго параметра (или измените значение по умолчанию наfalse
, и передайте,true
если вы хотите иметь дело с пробелом)источник
FluentSharp имеет
lowerCaseFirstLetter
метод, который делает этоhttps://github.com/o2platform/FluentSharp/blob/700dc35759db8e2164771a71f73a801aa9379074/FluentSharp.CoreLib/ExtensionMethods/System/String_ExtensionMethods.cs#L575
источник
Самый простой способ заглавной буквы:
1- Использование Sytem.Globalization;
`
источник
следующая функция верна для всех способов:
Я нашел это здесь
источник
char.IsWhiteSpace( array[ i -1 ] )
вместо того.. == ' '
, чтобы обрабатывать все пробелы. 2) удалить два места, которые делаютif (char.isLower(..))
- они не служат цели.ToUpper
просто ничего не делает, если символ не в нижнем регистре.Расширяя вопрос Карлоса выше, если вы хотите использовать несколько предложений с большой буквы, вы можете использовать этот код:
источник
Возможное решение для решения вашей проблемы.
источник