Подтвердить что ты не робот

Сделайте первую букву верхнего строчка строки (с максимальной производительностью)

У меня есть DetailsView с TextBox и я хочу, чтобы входные данные всегда сохранялись с ПЕРВЫМ БУКВОМ.

Пример:

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

Как я могу достичь этой максимальной производительности?


ПРИМЕЧАНИЕ:
Основываясь на ответах и комментариях под ответами, многие люди думают, что это вопрос об использовании всех слов в строке. Например => Red House Это не так, но если это то, что вы ищете, поищите один из ответов, который использует метод TextInfo ToTitleCase. (ПРИМЕЧАНИЕ. Эти ответы неверны для фактически заданного вопроса.)
См. Документ TextInfo.ToTitleCase для предостережений (не затрагивает слова, написанные заглавными буквами - они считаются аббревиатурами; могут содержать строчные буквы в середине слов, которые "не должны быть опущены", например, "McDonald" => "Mcdonald"; не гарантируется). обрабатывать все специфичные для культуры тонкости правил капитализации.)


ПРИМЕЧАНИЕ:
Вопрос неоднозначен ли письма после того, как первый должны быть принуждены к нижнему регистру. Принятый ответ предполагает, что только первая буква должна быть изменена. Если вы хотите, чтобы все буквы в строке, кроме первой, были строчными, найдите ответ, содержащий ToLower и не содержащий ToTitleCase.

4b9b3361

Ответ 1

Обновлено до С# 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.First().ToString().ToUpper() + input.Substring(1)
        }
    }
}

С# 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.First().ToString().ToUpper() + input.Substring(1);
        }
    }
}

Действительно старые ответы

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

EDIT: Эта версия короче. Для более быстрого решения взгляните на ответ Equiso

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

ОБНОВЛЕНИЕ 2: Вероятно, самым быстрым решением является Даррен (там даже тест), хотя я бы изменил его string.IsNullOrEmpty(s) для проверки исключения, так как исходное требование предполагает существование первой буквы, чтобы ее можно было использовать в верхнем регистре. обратите внимание, что этот код работает для общей строки, а не только для допустимых значений из Textbox.

Ответ 2

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();
}

Старый ответ: Это делает каждую первую букву в верхнем регистре

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

Ответ 3

Правильный путь заключается в использовании культуры:

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

Примечание: это будет использовать каждое слово в строке, например, "красный дом" → "красный дом". Решение также будет использовать заглавные буквы в нижнем регистре в словах, например, "старый Макдональд" → "старый Макдональд".

Ответ 4

Я взял самый быстрый метод из http://www.dotnetperls.com/uppercase-first-letter и преобразован в метод расширения:

    /// <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);
    }

ПРИМЕЧАНИЕ. Причина использования ToCharArray выше, чем альтернатива char.ToUpper(s[0]) + s.Substring(1), заключается в том, что выделяется только одна строка, тогда как подход Substring выделяет строку для подстроки, затем вторую строку для составления конечного результата.


EDIT. Вот как выглядит этот подход в сочетании с начальным тестом из 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);
    }

Ответ 5

Вы можете использовать метод ToTitleCase

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

этот метод расширения решает каждую проблему с заголовком.

простой в использовании

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

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

Метод расширения

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
    }
}

Ответ 6

Для первой буквы с проверкой ошибок:

public string CapitalizeFirstLetter(string s)
{
    if (String.IsNullOrEmpty(s))
        return s;
    if (s.Length == 1)
        return s.ToUpper();
    return s.Remove(1).ToUpper() + s.Substring(1);
}

И здесь то же самое, что и удобное расширение

public static string CapitalizeFirstLetter(this string s)
    {
    if (String.IsNullOrEmpty(s)) return s;
    if (s.Length == 1) return s.ToUpper();
    return s.Remove(1).ToUpper() + s.Substring(1);
    }

Ответ 7

public static string ToInvarianTitleCase(this string self)
{
    if (string.IsNullOrWhiteSpace(self))
    {
        return self;
    }

    return CultureInfo.InvariantCulture.TextInfo.ToTitleCase(self);
}

Ответ 8

Если производительность/использование памяти является проблемой, тогда она создает только одну (1) StringBuilder и одну (1) новую строку того же размера, что и исходная строка.

public static string ToUpperFirst(this string str) {
  if( !string.IsNullOrEmpty( str ) ) {
    StringBuilder sb = new StringBuilder(str);
    sb[0] = char.ToUpper(sb[0]);

    return sb.ToString();

  } else return str;
}

Ответ 9

Попробуйте следующее:

static public string UpperCaseFirstCharacter(this string text) {
    return Regex.Replace(text, "^[a-z]", m => m.Value.ToUpper());
}

Ответ 10

Если вам все равно, что первая буква будет заглавной и не имеет значения, остальная часть строки вы можете просто выбрать первый символ, сделать его верхним регистром и связать его с остальной частью строки без первоначального первого символа.

String word ="red house";
word = word[0].ToString().ToUpper() + word.Substring(1, word.length -1);
//result: word = "Red house"

Нам нужно преобразовать первый символ ToString(), потому что мы читаем его как массив Char, а тип Char не имеет метода ToUpper().

Ответ 11

Самый быстрый метод.

  private string Capitalize(string s){
        if (string.IsNullOrEmpty(s))
        {
            return string.Empty;
        }
        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
}

Тесты показывают следующие результаты (строка с 10000000 символами в качестве входных данных): Результаты тестирования

Ответ 12

Здесь можно сделать это как метод расширения:

static public string UpperCaseFirstCharacter(this string text)
{
    if (!string.IsNullOrEmpty(text))
    {
        return string.Format(
            "{0}{1}",
            text.Substring(0, 1).ToUpper(),
            text.Substring(1));
    }

    return text;
}

Затем можно вызвать как:

//yields "This is Brian test.":
"this is Brian test.".UpperCaseFirstCharacter(); 

И вот несколько модульных тестов для него:

[Test]
public void UpperCaseFirstCharacter_ZeroLength_ReturnsOriginal()
{
    string orig = "";
    string result = orig.UpperCaseFirstCharacter();

    Assert.AreEqual(orig, result);
}

[Test]
public void UpperCaseFirstCharacter_SingleCharacter_ReturnsCapital()
{
    string orig = "c";
    string result = orig.UpperCaseFirstCharacter();

    Assert.AreEqual("C", result);
}

[Test]
public void UpperCaseFirstCharacter_StandardInput_CapitalizeOnlyFirstLetter()
{
    string orig = "this is Brian test.";
    string result = orig.UpperCaseFirstCharacter();

    Assert.AreEqual("This is Brian test.", result);
}

Ответ 13

Так как я тоже работал над этим, и искал любые идеи, это решение, к которому я пришел. Он использует LINQ и сможет использовать первую букву строки, даже если первое вхождение не является буквой. Здесь метод расширения, который я закончил.

public static string CaptalizeFirstLetter(this string data)
{
    var chars = data.ToCharArray();

    // Find the Index of the first letter
    var charac = data.First(char.IsLetter);
    var i = data.IndexOf(charac);

    // capitalize that letter
    chars[i] = char.ToUpper(chars[i]);

    return new string(chars);
}

Я уверен, что есть способ немного оптимизировать или очистить его.

Ответ 14

Я нашел что-то здесь http://www.dotnetperls.com/uppercase-first-letter:

static string UppercaseFirst(string s)
{
// Check for empty string.
if (string.IsNullOrEmpty(s))
{
    return string.Empty;
}
// Return char and concat substring.
return char.ToUpper(s[0]) + s.Substring(1);
}

возможно, это помогает!

Ответ 15

Это будет сделано, хотя он также удостоверится, что нет ошибочных капиталов, которые не находятся в начале слова.

public string(string s)
{
System.Globalization.CultureInfo c = new System.Globalization.CultureInfo("en-us", false)
System.Globalization.TextInfo t = c.TextInfo;

return t.ToTitleCase(s);
}

Ответ 16

Здесь, кажется, сложная сложность, когда вам нужно всего лишь:

    /// <summary>
    /// Returns the input string with the first character converted to uppercase if a letter
    /// </summary>
    /// <remarks>Null input returns null</remarks>
    public static string FirstLetterToUpperCase(this string s)
    {
        if (string.IsNullOrWhiteSpace(s))
            return s;

        return char.ToUpper(s[0]) + s.Substring(1);
    }

Заметные моменты:

  • Его метод расширения.

  • Если вход пустой, пустой или пробельный, вход возвращается как есть.

  • String.IsNullOrWhiteSpace. Это не будет работать со старыми фреймворками.

Ответ 17

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

Ответ 18

Я хотел предоставить ответ "МАКСИМАЛЬНАЯ ПРОИЗВОДИТЕЛЬНОСТЬ". На мой взгляд, ответ "MAXIMUM PERFORMANCE" ловит все сценарии и дает ответ на вопрос, учитывающий эти сценарии. Итак, вот мой ответ. По этим причинам:

  • IsNullOrWhiteSpace учитывает строки, которые просто пробелы или null/empty.
  • .Trim() удаляет пробелы из передней и задней части строки.
  • .First() принимает первый символ ienumerable (или строки).
  • Мы должны проверить, является ли это буквой, которая может/должна быть прописной.
  • Затем мы добавляем остальную часть строки, только если длина указывает, что мы должны.
  • В наилучшей практике .Net мы должны предоставить культуру в System.Globalization.CultureInfo.
  • Предоставление им дополнительных параметров делает этот метод полностью повторным, без необходимости набирать выбранную культуру каждый раз.

    public static string capString(string instring, string culture = "en-US", bool useSystem = false)
    {
        string outstring;
        if (String.IsNullOrWhiteSpace(instring))
        {
            return "";
        }
        instring = instring.Trim();
        char thisletter = instring.First();
        if (!char.IsLetter(thisletter))
        {
            return instring;   
        }
        outstring = thisletter.ToString().ToUpper(new CultureInfo(culture, useSystem));
        if (instring.Length > 1)
        {
            outstring += instring.Substring(1);
        }
        return outstring;
    }
    

Ответ 19

Я думаю, что приведенный ниже метод является лучшим решением

    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

ссылка

Ответ 20

Это заглавные буквы этой буквы и каждой буквы, следующих за пробелом и строчными буквами, любую другую букву.

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;
        }
    }
}

Ответ 21

Используйте следующий код:

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

Ответ 22

Похоже, что ни одно из приведенных здесь решений не будет иметь дело с пробелом перед строкой.

Просто добавив это как мысль:

public static string SetFirstCharUpper2(string aValue, bool aIgonreLeadingSpaces = true)
{
    if (string.IsNullOrWhiteSpace(aValue))
        return aValue;

    string trimmed = aIgonreLeadingSpaces 
           ? aValue.TrimStart() 
           : aValue;

    return char.ToUpper(trimmed[0]) + trimmed.Substring(1);
}   

Он должен обрабатывать this won't work on other answers (это предложение имеет место в начале), и если вам не нравится обрезка пространства, просто передайте false в качестве второго параметра (или измените значение по умолчанию на false, и пройдите true, если вы хотите иметь дело с пространством)

Ответ 24

Это самый быстрый способ:

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

Без изменения исходной строки:

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;
}

Ответ 25

Самый простой способ заглавной буквы firs:

1- Использование Sytem.Globalization;

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

  myTI.ToTitleCase(textboxname.Text)

`

Ответ 26

следующая функция верна для всех способов:

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);
}

Я обнаружил, что здесь

Ответ 27

Развернув вопрос Карлоса выше, если вы хотите использовать несколько предложений, вы можете использовать этот код:

    /// <summary>
    /// Capitalize first letter of every sentence. 
    /// </summary>
    /// <param name="inputSting"></param>
    /// <returns></returns>
    public string CapitalizeSentences (string inputSting)
    {
        string result = string.Empty;
        if (!string.IsNullOrEmpty(inputSting))
        {
            string[] sentences = inputSting.Split('.');

            foreach (string sentence in sentences)
            {
                result += string.Format ("{0}{1}.", sentence.First().ToString().ToUpper(), sentence.Substring(1)); 
            }
        }

        return result; 
    }

Ответ 28

Недавно у меня было похожее требование, и я вспомнил, что функция LINQ Select() предоставляет индекс:

string input;
string output;

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

Поскольку мне это нужно очень часто, я сделал метод расширения для строкового типа:

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));
    }
}

Обратите внимание, что только первая буква преобразуется в верхний регистр - все остальные символы не затрагиваются. Если вам нужны другие символы в нижнем регистре, вы также можете вызвать Char.ToLower(currentChar) для index> 0 или вызвать ToLower() для всей строки в первую очередь.

Что касается производительности, я сравнил код с решением от Darren. На моей машине код Даррена примерно в 2 раза быстрее, что неудивительно, поскольку он напрямую редактирует только первую букву в массиве символов. Поэтому я предлагаю вам взять код Даррена, если вам нужно самое быстрое из доступных решений. Если вы хотите интегрировать и другие манипуляции со строками, может быть удобно, чтобы выразительная сила лямбда-функции касалась символов входной строки - вы можете легко расширить эту функцию - поэтому я оставлю это решение здесь.

Ответ 29

Проверьте, не является ли строка нулевой, затем преобразуйте первый символ в верхний регистр, а остальные - в нижний регистр:

public static string FirstCharToUpper(string str)
{
    return str?.First().ToString().ToUpper() + str?.Substring(1).ToLower();
}

Ответ 30

С помощью этого метода вы можете выдержать первый char каждого слова.

Пример "HeLlo wOrld" = > "Hello World"

public static string FirstCharToUpper(string input)
{
    if (String.IsNullOrEmpty(input))
        throw new ArgumentException("Error");
    return string.Join(" ", input.Split(' ').Select(d => d.First().ToString().ToUpper() +  d.ToLower().Substring(1)));
}