C # исправить предложение - PullRequest
1 голос
/ 25 марта 2012

Мне нужно взять предложение, состоящее из одной строки без пробелов, и каждое новое слово имеет заглавную букву EX.«StopAndSmellTheRoses», а затем преобразовать его в «Остановить и понюхать розы». Это моя функция, которая у меня есть, но я продолжаю получать аргумент из-за ошибки диапазона в методе вставки.Спасибо за любую помощь заранее.

private void FixSentence()
{
    // String to hold our sentence in trim at same time
    string sentence = txtSentence.Text.Trim();

    // loop through the string
    for (int i = 0; i < sentence.Length; i++)
    {
        if (char.IsUpper(sentence, i) & sentence[i] != 0)
        {
            // Change to lowercase
            char.ToLower(sentence[i]);

            // Insert space behind the character
            // This is where I get my error
            sentence = sentence.Insert(i-1, " ");
        }
    }

    // Show our Fixed Sentence
    lblFixed.Text = "";
    lblFixed.Text = "Fixed: " + sentence;
}

Ответы [ 4 ]

3 голосов
/ 25 марта 2012

Лучший способ создать String таким образом - использовать экземпляр StringBuilder.

var sentence = txtSentence.Text.Trim();
var builder = new StringBuilder();
foreach (var cur in sentence) {
  if (Char.IsUpper(cur) && builder.Length != 0) {
    builder.Append(' ');
  }
  builder.Append(cur);
}

// Show our Fixed Sentence
lblFixed.Text = "";
lblFixed.Text = "Fixed: " + builder.ToString();

При использовании метода Insert каждый раз создается новый экземпляр string, что приводит к множеству ненужных значений. Однако StringBuilder фактически не выделит String, пока вы не вызовете метод ToString.

1 голос
/ 25 марта 2012

Вот ответ

var finalstr = Regex.Replace(
        "StopAndSmellTheRoses",
        "(?<=[a-z])(?<x>[A-Z])|(?<=.)(?<x>[A-Z])(?=[a-z])|(?<=[^0-9])(?<x>[0-9])(?=.)",
        me => " " + me.Value.ToLower() 
    );

будет выводить

Stop and smell the roses
0 голосов
/ 25 марта 2012

Другая версия:

public static class StringExtensions
{
  public static string FixSentence(this string instance)
  {
    char[] capitals = Enumerable.Range(65, 26).Select(x => (char)x).ToArray();
    string[] words = instance.Split(capitals);
    string result = string.Join(' ', words);
    return char.ToUpper(result[0]) + result.Substring(1).ToLower();
  }
}
0 голосов
/ 25 марта 2012

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

Вместо этого вам нужна вторая строковая переменная, в которую вы добавляете все найденные слова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...