2010-08-25 3 views
105

Я хотел бы иметь метод, который преобразует первый символ строки в нижний регистр.BestPractice - преобразование первого символа строки в нижний регистр

Мои подходы:

1.

public static string ReplaceFirstCharacterToLowerVariant(string name) 
{ 
    return String.Format("{0}{1}", name.First().ToString().ToLowerInvariant(), name.Substring(1)); 
} 

2.

public static IEnumerable<char> FirstLetterToLowerCase(string value) 
{ 
    var firstChar = (byte)value.First(); 
    return string.Format("{0}{1}", (char)(firstChar + 32), value.Substring(1)); 
} 

Что бы ваш подход?

ответ

176

Я хотел бы использовать это:

Char.ToLowerInvariant(name[0]) + name.Substring(1) 

Ваше первое решение не оптимизировано: string.Format медленно и не нужно, если у вас есть формат, который никогда не изменится.

Второй является уродливым и не ремонтируемым.

+3

я хотел бы сделать это:. 'Char.ToLower (имя [0]) ToString() + name.Substring (1)' – Andrey

+0

да, я просто обновляю свой ответ, спасибо – onof

+0

я думал, что concatination из строки с оператором + медленны и уродливы, не так ли? – Rookian

3

Шахта

if (!string.IsNullOrEmpty (val) && val.Length > 0) 
{ 
    return val[0].ToString().ToLowerInvariant() + val.Remove (0,1); 
} 
+3

Мне любопытно, почему 'val.Remove'? Кажется немного интуитивным для меня. – Thorarin

+0

@Thorarin очевидно, потому что вы хотите удалить первый символ (потому что вы добавляете версию нижнего регистра спереди) – riki

44

В зависимости от ситуации, немного оборонительное программирование может быть желательным:

public static string FirstCharacterToLower(string str) 
{ 
    if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0)) 
     return str; 

    return Char.ToLowerInvariant(str[0]) + str.Substring(1); 
} 

if заявления также предотвращает новую строку из строятся, если он не будет все равно. Возможно, вы захотите, чтобы этот метод завершился неудачей с нулевым входом, и введите ArgumentNullException.

Как люди упомянули, используя String.Format для этого излишне.

+7

+1 для проверки, действительно ли вам нужно что-либо делать вообще. :) – Chris

+0

Исправьте меня, если я ошибаюсь, но str.Substring (1) вернет символ в позиции 1, поскольку счетчик для этого метода не указан. , поэтому у вас будет char [0] в нижнем регистре + символ в позиции 1 Поэтому я предпочел удалить один символ, начиная с первого символа в строке. Результатом является строка без первой буквы. Затем я добавлю эту строку в первый символ, который преобразуется в нижний регистр – fedotoves

+2

@ B-Rain: учтите, что вы исправили: http://msdn.microsoft.com/en-us/library/hxthx5h6%28VS.90%29.aspx – Thorarin

2

Мне нравится принятый ответ, но помимо проверки string.IsNullOrEmpty Я также проверял бы, если Char.IsLower(name[1]) в случае, если вы имеете дело с аббревиатурой. Например. вы бы не хотели, чтобы «СПИД» стал «СПИД».

+3

IMO это ответственность звонящего – onof

-2

Лучше использовать String.Concat, чем String.Format, если вы знаете, что формат не является изменением данных, и требуется просто конкатенация.

4

На всякий случай это помогает любому, кто случайно наткнулся на этот ответ.

Я думаю, что это было бы лучше всего как метод расширения, тогда вы можете назвать его с помощью вашейString.FirstCharacterToLower();

public static class StringExtensions 
{ 
    public static string FirstCharacterToLower(this string str) 
    { 
     if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0)) 
     { 
      return str; 
     } 

     return Char.ToLowerInvariant(str[0]) + str.Substring(1); 
    } 
} 
0

Комбинировано несколько штук и сделало его цепным расширением. Добавлено короткое замыкание на пробелы и без буквы.

public static string FirstLower(this string input) => 
    (!string.IsNullOrWhiteSpace(input) && input.Length > 0 
     && char.IsLetter(input[0]) && !char.IsLower(input[0])) 
    ? input[0].ToString().ToLowerInvariant() + input.Remove(0, 1) : input; 
Смежные вопросы