Функция Break Camel Case в C#

Я пытаюсь решить эту проблему в codewars, но я не знал, что в этом плохого. Ошибка сказала:

System.ArgumentOutOfRangeException: длина не может быть меньше нуля.

Имя параметра: длина

Я буду признателен за любую помощь

public static string BreakCamelCase(string str)
{   
    if (str.Length < 1) 
        return "";

    var res = "";

    foreach (var c in str)
    {
        if (char.IsUpper(c))
            res = str.Substring(0,str.IndexOf(c)) + " " + str.Substring(str.IndexOf(c));

        str = res;
    } 

    return res;
}

1 ответ

Самое время для хрустального шара (реверс-инжиниринг)... Кажется, вы хотите добавить пространство (' ') перед каждым заглавным символом:

"MyOwnString" -> " My Own String"
"something"   -> "something"
"camelCase"   -> "camel Case"
"наРусском"   -> "на Русском"    // all languages (e.g. Russian), not only English

Если это ваша первоначальная задача, вы можете выполнить ее следующим образом

public static string BreakCamelCase(string str) {   
  // "str.Length<1" will fail in case str == null. Do not re-invent the wheel
  if (string.IsNullOrEmpty(str))
    return str;

  // A simple Linq query:
  return string.Concat(str       // concat all chunks
   .Select(c => char.IsUpper(c)  // which can be
      ? " " + c.ToString()       //   uppercase
      : c.ToString()));          //   others 
}

Если вы предпочитаете старое доброе решение:

public static string BreakCamelCase(string str) {   
  if (string.IsNullOrEmpty(str))
    return str;

  // We want to build string in a loop. 
  // StringBuilder has been specially desinged for this
  StringBuilder sb = new StringBuilder();

  foreach (var c in str) {
    if (char.IsUpper(c))    
      sb.Append(' ');

    sb.Append(c);
  }

  return sb.ToString();
}

Наконец, вы можете попробовать регулярные выражения:

public static string BreakCamelCase(string str) {   
  if (string.IsNullOrEmpty(str))
    return str;

  return Regex.Replace(str, @"(\p{Lu})", " $1");
}
Другие вопросы по тегам