2015-04-04 12 views
-2

Имейте задание, позволяющее пользователю вводить слово в C#, а затем отображать это слово с первым и третьим символами, измененными на верхний регистр. Код следует:Использование string.ToUpper на подстроке

namespace Capitalizer 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string text = Console.ReadLine(); 
      char[] delimiterChars = { ' ' }; 
      string[] words = text.Split(delimiterChars); 
      string Upper = text.ToUpper(); 
      Console.WriteLine(Upper); 
      Console.ReadKey(); 
     } 
    } 
} 

Это, конечно, генерирует все слово в верхнем регистре, чего я не хочу. Кажется, я не могу сделать text.ToUpper (0,2), и даже тогда это будет использовать первые три буквы. Единственное решение, о котором я могу сейчас думать, что бы слово отображалось на одной строке (и я не знаю, работает ли оно), - это перемещение заглавных букв и строчных букв в массив символов и попытаться получить это, чтобы напечатать все значения в измененный порядок.

+1

где вы используете подстроку ..? [MSString SubString Function] (https://msdn.microsoft.com/en-us/library/system.string.substring%28v=vs.110%29.aspx) – MethodMan

+0

Это более сложный вопрос, чем вы знаете. Unicode - кодировка переменной длины, поэтому первый и третий видимый «символ» могут быть не текстовыми [0], а текстом [2]. –

+1

_ «с первым и третьим символами, измененными на верхний регистр» _ - вы правильно это записывали? Если да, то почему вы разделяете строку? Что «слова» связаны с этим вопросом? И наоборот, если «слова» релевантны, а) почему бы вам не использовать его в коде, и б) объясните в своем вопросе _, как это уместно и каковы фактические требования здесь. –

ответ

2

Вы можете использовать LINQ:

var upperCaseIndices = new[] { 0, 2 }; 
var message = "hello"; 
var newMessage = new string(message.Select((c, i) => 
    upperCaseIndices.Contains(i) ? Char.ToUpper(c) : c).ToArray()); 

Вот как это работает. message.Select (встроенный LINQ запрос) выбирает символы из message по одному и передает в функцию селектора:

upperCaseIndices.Contains(i) ? Char.ToUpper(c) : c 

написана как C# ?: shorthand syntax для if. Он читается как «Если в массиве присутствует индекс, тогда выберите символ верхнего регистра. В противном случае выберите символ как есть».

(c, i) => condition 

- lambda expression. Смотрите также:

Остальное очень просто - представляют собой результат как массив символов (.ToArray()), и создать новую строку, основанную розыгрыш (new string(...)).

+0

Я не думаю, что OP поймет этот удивительный ответ, поскольку функция Substrings намного легче понять, чем lambda и?: Оператор отличный ответ, кстати .. +1 – MethodMan

+0

@MethodMan: Спасибо. Я добавил некоторые объяснения со ссылками. Надеюсь, теперь легче переварить. :) – Neolisk

+0

очень неэффективно. –

2

Только решение, о котором я могу думать сейчас, что бы слово отображалось на одной строке (и я не знаю, работает ли оно), - это перемещать заглавные буквы и строчные буквы в массив символов и пытаться получить что для печати всех значений в модифицированном порядке.

Это кажется намного более сложным, чем необходимо. Когда у вас есть массив символов, вы можете просто изменить элементы этого массива символов. В отдельной функции, то она будет выглядеть примерно так

string MakeFirstAndThirdCharacterUppercase(string word) { 
    var chars = word.ToCharArray(); 
    chars[0] = chars[0].ToUpper(); 
    chars[2] = chars[2].ToUpper(); 
    return new string(chars); 
} 
0

Мой простое решение:

string text = Console.ReadLine(); 
     char[] delimiterChars = { ' ' }; 
     string[] words = text.Split(delimiterChars); 

     foreach (string s in words) 
     { 
      char[] chars = s.ToCharArray(); 

      chars[0] = char.ToUpper(chars[0]); 
      if (chars.Length > 2) 
      { 
       chars[2] = char.ToUpper(chars[2]); 
      } 
      Console.Write(new string(chars)); 
      Console.Write(' '); 
     } 
     Console.ReadKey(); 
+0

Спасибо, но кажется, что ToUpper не работает на charArrays –

+0

Я сам это испытал, и это определенно работает. – Frayt

+0

Странно. Я постоянно получал «никакой перегрузки для метода ToUpper принимает 0 аргументов». В любом случае, присвоение успешно завершено. –

5

Самый простой способ, которым я могу думать, чтобы решить ваш точный вопрос, как описано — преобразовать в прописные случае первой и третий символы входа — будет что-то вроде следующего:

StringBuilder sb = new StringBuilder(text); 

sb[0] = char.ToUpper(sb[0]); 
sb[2] = char.ToUpper(sb[2]); 

text = sb.ToString(); 

Класс StringBuilder по существу является изменяемым строковым объектом, поэтому при выполнении таких операций наиболее жидким способом решения проблемы является то, что оно обеспечивает самые простые преобразования с и из всех операций, а также полный диапазон операций с строками. Изменение отдельных символов легко во многих структурах данных, но вставки, удаления, добавление, форматирование и т. Д. Также поставляются с StringBuilder, так что это хорошая привычка использовать это по сравнению с другими подходами.

Но, честно говоря, трудно понять, как это полезно. Я не могу не задаться вопросом, неправильно ли вы указали требования, и есть что-то большее в этом вопросе, чем здесь.

+0

Спасибо. , но вот оно: «Напишите программу, в которой пользователь вводит слово во всех строчных строках. Преобразуйте первую и третью буквы в верхний регистр и выведите строку. " –

Смежные вопросы