
给出一种解决方案如下:
internal class ConvertTool
{
static Random mRad = new Random();
const int ConvertMinLength = 4;
private static char[] SplitChars = new[] { ' ', ',', '.', '!' };
/// <summary>
/// 转换
/// </summary>
/// <param name="textString"></param>
/// <returns></returns>
public static string ConverText(string textString)
{
int textLength = textString.Length;
var firstSplitCharIndex = textString.IndexOfAny(SplitChars);
if (firstSplitCharIndex < ConvertMinLength)
{
return textString;
}
StringBuilder stringBuilder = new StringBuilder(textString);
int startRandomIndex = 1;
const int randomStep = 2;
var splitCharIndex = firstSplitCharIndex;
while (splitCharIndex != -1 && splitCharIndex < textLength)
{
ConvertWordToRandom(stringBuilder, startRandomIndex, splitCharIndex - randomStep);
startRandomIndex = splitCharIndex + randomStep;
splitCharIndex = textString.IndexOfAny(SplitChars, splitCharIndex + 1);
Console.WriteLine("splitCharIndex-{0},startRandomIndex-{1}", splitCharIndex, startRandomIndex);
}
return stringBuilder.ToString();
}
/// <summary>
/// 打乱某个单词
/// </summary>
/// <param name="sb"></param>
/// <param name="startIndex"></param>
/// <param name="endIndex"></param>
static void ConvertWordToRandom(StringBuilder sb, int startIndex, int endIndex)
{
if (startIndex >= endIndex)
{
return;
}
var sourceIndex = startIndex;
var validateLength = endIndex - startIndex;
while (validateLength > 1)
{
var targetIndex = mRad.Next(validateLength) + sourceIndex;
SwitchToChar(sb, sourceIndex, targetIndex);
sourceIndex++;
validateLength = endIndex - sourceIndex;
}
}
/// <summary>
/// 替换指定两个位置的字符
/// </summary>
/// <param name="sb"></param>
/// <param name="sourceIndex"></param>
/// <param name="targetIndex"></param>
private static void SwitchToChar(StringBuilder sb, int sourceIndex, int targetIndex)
{
if (sourceIndex == targetIndex || sourceIndex < 0 || sourceIndex >= sb.Length || targetIndex < 0 || targetIndex >= sb.Length)
{
return;
}
char tempChar = sb[targetIndex];
sb[targetIndex] = sb[sourceIndex];
sb[sourceIndex] = tempChar;
}
}