Extension method splitting string on each capital letter I'm creating my own game and for some statistics I need to get the names of specific objects. The problem was that I had them declared like "SmallFireBall" but I wanted them to appear like"Small Fire Ball" because that's something the user is able to see, so I decided to create my own extension method to help me out:

public static string SplitOnCapitalLetters(this string inputString)
{
    List&lt;char&gt; cleanString = inputString.ToList();
    for (int i = 1; i &lt; cleanString.Count; i++)
    {
        if (char.IsUpper(cleanString[i]))
        {
            char[] temp = new char[cleanString.Count - i];
            for (int j = 0; j &lt; temp.Length; j++)
            {
                temp[j] = cleanString[j + i];
            }
            cleanString[i] = ' ';
            cleanString.Add(' ');
            int index = 0;
            for (int j = i + 1; j &lt; cleanString.Count; j++)
            {
                cleanString[j] = temp[index];
                index++;
            }
            i++;
        }
    }
    return new string(cleanString.ToArray());
}


However, I'm not quite confident about it. It seems quite big and maybe a little bit ugly, so please address any performance or code style issues.
With regex it's virtually a one-liner:

var words = 
    Regex.Matches("SmallFireBall", @"([A-Z][a-z]+)")
    .Cast&lt;Match&gt;()
    .Select(m =&gt; m.Value);

var withSpaces = string.Join(" ", words);



Regex.Matches - searches an input string for all occurrences of a regular expression and returns all the matches. MSDN
[A-Z][a-z]+ - matches strings that begin with a capital letter and are followed by one or more lowercase letters


Output:


  Small Fire Ball




Let's review your code anyway and optimize it a little bit. Even without regex it still can be very short.


Use a StringBuilder for building string dynamically
You can use a foreach loop for strings too

public static string SplitOnCapitalLetters2(this string inputString)
{
    var result = new StringBuilder();

    foreach (var ch in inputString)
    {
        if (char.IsUpper(ch) &amp;&amp; result.Length &gt; 0)
        {
            result.Append(' ');
        }
        result.Append(ch);
    }
    return result.ToString();
}





The 3rd alternative would be only LINQ:

public static string SplitOnCapitalLetters3(this string inputString)
{
    // starts with an empty string and accumulates the new string into 'result'
    // 'next' is the next character
    return inputString.Aggregate(string.Empty, (result, next) =&gt;
    {
        if (char.IsUpper(next) &amp;&amp; result.Length &gt; 0)
        {
            result += ' ';
        }
        return result + next;
    });
}