String.Replace(string, string)
заменит каждый экземпляр первого слова параметра вторым словом параметра.Если вы хотите, чтобы каждый отдельный экземпляр одного и того же слова заменялся другой строкой, вам придется отделить слово строки, выполнить итерацию по ним, и каждый раз, когда вы найдете слово, которое хотите заменить, замените его случайной строкой.
Вот пример (при условии, что у вас уже есть метод для получения случайного слова):
string Source = "The quick brown fox jumps over the lazy dog.\r\nThe quick brown fox jumps over the lazy dog.";
string[] ReplaceWords = { "quick", "fox", "lazy", "dog" };
string[] SourceWords = Source.Split(' ');
string result = "";
for (int i = 0; i < SourceWords.Length; i++)
{
if (ReplaceWords.Contains(SourceWords[i]))
result += " " + GetRandomWord();
else
result += " " + SourceWords[i];
}
result = result.Trim() //Remove white spaces at the begining and end of the string.
result = "The fdhs brown fdsfsd jumps over the hgfih turioutro.\r\nThe cxnvcxn brown oipuop jumps over the rewrre kmlçnlç."
Таким образом, каждый экземпляр слова «быстрый»«fox», «lazy» и «dog» будут заменены другой строкой.В моем примере я, очевидно, только случайным образом нажимаю на клавиатуру, чтобы проиллюстрировать свою точку зрения, но если у вас есть функция GetRandomWord
, которая получает существующие слова из списка, она тоже будет работать:
result = "The tree brown house jumps over the grass shell.\r\nThe hidrant brown mushroom jumps over the ocean skateboard."
Все мои примеры отсталые, но они иллюстрируют мою точку зрения.
Надеюсь, я помог:)
Просто ради интереса
Если вы сделаете GetRandomWord
, товыбирает слова из существующих списков И это с учетом контекста, вы можете получить предложения, которые могут действительно иметь смысл.
Давайте создадим enum
для наших контекстов.Для простоты ... Давайте просто сделаем это просто:
enum Context
{
Adjective,
Noun
}
Теперь давайте создадим наши списки:
string[] Nouns = {"dog", "cat", "fox", "horse", "bird"};
string[] Adjectives {"lazy", "sleepy", "quick", "big", "small"};
Теперь для нашего метода:
string GetRandomWord(Context c)
{
Random R = new Random();
switch (c)
{
case Context.Noun:
return Nouns[R.Next(0, Nouns.Length)];
break;
case Context.Adjective:
return Adjectives[R.Next(0, Adjectives.Length)];
break;
}
}
Теперь небольшое изменение в тексте, заменяющем код:
string Source = "The quick brown fox jumps over the lazy dog.\r\nThe quick brown fox jumps over the lazy dog.";
string[] ReplaceAdjectives = { "quick", "lazy" };
string[] ReplaceNouns = { "fox", "dog" };
string[] SourceWords = Source.Split(' ');
string result = "";
for (int i = 0; i < SourceWords.Length; i++)
{
if (ReplaceAdjectives.Contains(SourceWords[i]))
result += " " + GetRandomWord(Context.Adjective);
else if (ReplaceNouns.Contains(SourceWords[i]))
result += " " + GetRandomWord(Context.Noun);
else
result += " " + SourceWords[i];
}
result = result.Trim() //Remove white spaces at the begining and end of the string.
result = "The sleepy brown bird jumps over the small horse.\r\nThe lazy brown cat jumps over the sleepy dog."
Как я уже сказал, полученное случайное предложение МОЖЕТ иметь некоторый смысл.Но, по крайней мере, это будет иметь некоторый смысл с точки зрения синтаксиса.
Поскольку наши списки соответствуют указателям на существительные с соответствующими им прилагательными, создающими смысл, мы можем также изменить код, чтобы получить случайные результатыэто гарантированно имеет смысл.
Все, что нам нужно сделать, - это создать новый метод с именем GetMatchingWord(Context, int)
.Он принимает int, потому что он больше не рандомизирует выбор слова сам по себе.Теперь это делается в вызывающем методе.
string GetMatchingWord(Context c, int i)
{
switch (c)
{
case Context.Noun:
return Nouns[i];
break;
case Context.Adjective:
return Adjectives[i];
break;
}
}
Затем мы соответствующим образом модифицируем наш код:
string Source = "The quick brown fox jumps over the lazy dog.\r\nThe quick brown fox jumps over the lazy dog.";
string[] ReplaceAdjectives = { "quick", "lazy" };
string[] ReplaceNouns = { "fox", "dog" };
bool GuaranteeMatch = true;
string[] SourceWords = Source.Split(' ');
string result = "";
Random R = new Random();
for (int i = 0; i < SourceWords.Length; i++)
{
if (GuaranteeMatch)
{
int I = R.Next(0, Adjectives.Length) //Adjectives and Nouns have the same Length. This is a requirement for this method to work.
if (ReplaceAdjectives.Contains(SourceWords[i]))
result += " " + GetMatchingWord(Context.Adjective, I);
else if (ReplaceNouns.Contains(SourceWords[i]))
result += " " + GetMatchingWord(Context.Noun, I);
else
result += " " + SourceWords[i];
}
else
{
if (ReplaceAdjectives.Contains(SourceWords[i]))
result += " " + GetRandomWord(Context.Adjective);
else if (ReplaceNouns.Contains(SourceWords[i]))
result += " " + GetRandomWord(Context.Noun);
else
result += " " + SourceWords[i];
}
}
result = result.Trim() //Remove white spaces at the begining and end of the string.
Теперь, если GuaranteeMatch
истинно, мы всегда будем получать результаты, такие как:result = "The big brown horse jumps over the sleepy cat.\r\nThe lazy brown dog jumps over the small bird."
Он даже сможет вернуть исходное предложение, поскольку заменяемые слова также существуют в списках слов, чтобы заменить их на.