2016-10-05 15 views
1

私は、ユーザー指定の長さのスペースを含むランダムな文字列を作成するメソッドを持っています。問題は、文字列の先頭にスペースが挿入され、連続したスペースが作成されることがあることです。どうすれば私の文字列は最初の文字に空白を持つことはありませんが、それでも他のインデックスにスペースを持たせることができます(不連続)。空白(文字間に1つのスペース)を含むランダムな文字列を作成し、最初の文字は空白ではありません

public static string CreateRandomString(int sizeOfString) 
    { 
     const string chars = "A b C D e F g H I 1 2 3 4 5 6 7 8 "; 

     var random = new Random(); 
     return new string(Enumerable.Repeat(chars, sizeOfString) 
      .Select(s => s[random.Next(s.Length)]).ToArray()); 
    } 
+1

あなたは何を試してみましたか?私はそれをやっている2つの本当に明白な方法を考えています。 –

+1

TrimStart()。ToArray(); ' – Tim

+0

TrimStart()' - 新しい文字列を返します(Enumerable.Repeat(chars、sizeOfString).Select(s => s [random.Next(s.Length)]) 'TrimStart'の問題は、' sizeOfString'で要求された文字列よりも短い文字列を持つ可能性があることです。 –

答えて

3

は、あなたが作成することができます。私はsizeOfStringパラメータで正確になりたい心に留めておいてください、私はまだ文字

のユーザーが指定した量であることを最終的な結果を必要とするこれが私の方法であり、ランダムな文字の無限のシーケンス、それらがスペースである間スキップして、あなたが望む文字の数を取る。

関数内に新しいランダムを宣言した場合、関数を頻繁に呼び出すと、ランダムな文字列が繰り返されます。

また、スペースの半分以上がスペースであるため、スペースの頻度が非常に高いので、これを軽減するためにchars = " AbCDeFgHI12345678"を使用できます。

private static Random random = new Random(); 

public static string CreateRandomString(int sizeOfString) 
{ 
    const string chars = "A b C D e F g H I 1 2 3 4 5 6 7 8 "; 

    var randomChars = 
     InitInfinite(() => chars[random.Next(chars.Length)]) 
      .SkipWhile(c => c == ' ') 
      .Take(sizeOfString); 

    return new string(randomChars.ToArray()); 
} 

public static IEnumerable<T> InitInfinite<T>(Func<T> selector) 
{ 
    while (true) 
    { 
     yield return selector(); 
    } 
} 

編集 - そしてここにバージョン2(最終版)です:

public static string CreateRandomSentence(int sizeOfString) 
{ 
    var sb = new StringBuilder(); 

    while (sb.Length < sizeOfString) 
    { 
     int wordLength = random.Next(8) + 1; 
     sb.Append(CreateRandomString(wordLength)).Append(" "); 
    } 

    sb.Length = sizeOfString; 

    return sb.ToString(); 
} 

public static string CreateRandomString(int sizeOfString) 
{ 
    const string chars = "AbCDeFgHI12345678"; 

    var randomChars = 
     InitInfinite(() => chars[random.Next(chars.Length)]) 
      .SkipWhile(c => c == ' ') 
      .Take(sizeOfString); 

    return new string(randomChars.ToArray()); 
} 

public static IEnumerable<T> InitInfinite<T>(Func<T> selector) 
{ 
    while (true) 
    { 
     yield return selector(); 
    } 
} 

private static Random random = new Random(); 
+0

'String.Join'を使用してLINQyにすることができます:)(char配列の文字列よりも少し遅いでしょう) –

+0

これにはまだ空きが少ない(最初の文字を除く)? –

+0

はい、A b C D e F g H I 1 2 3 4 5 6 7 8 "を使用すると、各文字は50のうち33倍(66%)スペースになります。 '' AbCDeFgHI12345678 ''を使うと、時間のわずか2%の空間になります –

関連する問題