c# 中的打破驼峰式大小写函数

Break Camel Case function in c#

我试图在代码战中解决这个问题,但我不知道它有什么问题。错误说:

System.ArgumentOutOfRangeException : Length cannot be less than zero.

Parameter name: Length

我会很感激任何帮助

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

现在是 crystal 球 (逆向工程)的好时机...看来,您想 添加 space (' ') 之前 每个大写字符:

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

如果你更喜欢旧的 loop 解决方案:

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