Random String methods for C#

Background:

Sometimes, we need to generate some random strings for testing purpose. When I met this situation, I was surprised that C# has no such built-in methods inside its Random Class. So I had to implemented them as extension methods.

Solution:

    #region Random's Extension
    public static class RandomExtension
    {
        /// 
        /// Returns a random character between the start and end characters specified
        /// 
        /// 
        /// The start of the range that the next random character will be generated from
        /// The end of the range that the next random character will be generated from
        /// A character whose ASCII code greater than or equal to the start's and less than or equal to the end's
        public static char NextChar(this Random rnd, char start = 'a', char end = 'z')
        {
            int startCode = (int)start;
            int endCode = (int)end + 1;
            if (startCode <= endCode)
            {
                int code = rnd.Next(startCode, endCode);
                return (char)code;
            }
            else
            {
                throw new ArgumentException("The 'start' character can NOT be greater than the 'end' charcater", "start");
            }
        }
    /// <summary>
    /// Returns a random character among a set of specified characters
    /// </summary>
    /// <param name="rnd" /></param>
    /// <param name="candidates" />A set of the characters that the new random character will be generated from</param>
    /// <returns>A character from the specified character set</returns>
    public static char NextChar(this Random rnd, char[] candidates)
    {
        if (candidates.Length &gt; 0)
            return candidates[rnd.Next(0, candidates.Length)];
        else
            throw new ArgumentException(&quot;Must specify at least 1 character in the array (char[] candidates).&quot;, &quot;candidates&quot;);
    }

    /// <summary>
    /// Returns a random letter character ({'a' - 'z'} + {'A' - 'Z'})
    /// </summary>
    /// <param name="rnd" /></param>
    /// <returns>A character of the 26 English letters ignoring case.</returns>
    public static char NextLetter(this Random rnd)
    {
        return rnd.NextChar(new char[] { rnd.NextChar('a', 'z'), rnd.NextChar('A', 'Z') });
    }

    /// <summary>
    /// Returns a random letter string (a string contains only letters, no other special characters) with customized length
    /// </summary>
    /// <param name="rnd" /></param>
    /// <param name="length" />The length that the random string will be in</param>
    /// <returns>A string contains only letters.</returns>
    public static string NextLetterString(this Random rnd, int length = 10)
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i &lt; length; i++)
        {
            sb.Append(rnd.NextLetter());
        }
        return sb.ToString();
    }
}
#endregion</pre>

Remark:

After I published this post, I just found out that I had already posted this one half a year ago which I totally forgot, and I was amazed by their similarities. The words I used in these 2 posts are almost the same! That indicates I hadn't changed a lot in recent half year. :)

I will keep this post other than update the old one, because I think the similarity is very interesting.