Помогите подредактировать сниппет

  • Автор темы Автор темы gs517
  • Дата начала Дата начала

gs517

Client
Регистрация
18.05.2013
Сообщения
138
Реакции
15
Баллы
18
Есть сниппет:

Код:
Развернуть Свернуть Копировать
var list = project.Lists["rand_str"].ToList();
var pattern = "str";
var text = project.Variables["text_spin"].Value;
for (int i = 1; i <= 5; i++)
        {
list.Shuffle();
var randomStr0 =  string.Join("", list.Take(1).ToArray());
var n = new Random().Next(0,172);
var match = System.Text.RegularExpressions.Regex.Matches(text, pattern)[n];
text = text.Remove(match.Index, match.Length).Insert(match.Index, randomStr0);
        }
return text;

Суть. В тексте расставлены макросы str. Их в рандомном порядке нужно заменить рандомное кол-во раз, на рандомные строки из списка (более 50 тыс. строк).
Данный снип вроде справляется с задачей, но только когда нужно сделать не более 5 итераций цикла, если допустим поставить "for (int i = 1; i <= 50; i++)" и более, то получим ошибку: Specified argument was out of the range of valid values.
Parameter name: i

сколько не искал не могу понять суть проблемы, в c# не разбираюсь, данный снип собрал при помощи гугла и кривых рук.
 
Никто не подскажет :(
 
надо просто считывать длину списка и кидать не слишком многогранный кубик

Код:
Развернуть Свернуть Копировать
var list = project.Lists["rand_str"].ToList();
int maxNumber = list.Count;
var pattern = "str";
var text = project.Variables["text_spin"].Value;
for (int i = 1; i <= 5; i++)
        {
list.Shuffle();
var randomStr0 =  string.Join("", list.Take(1).ToArray());
var n = new Random().Next(0,maxNumber);
var match = System.Text.RegularExpressions.Regex.Matches(text, pattern)[n];
text = text.Remove(match.Index, match.Length).Insert(match.Index, randomStr0);
        }
return text;
 
надо просто считывать длину списка и кидать не слишком многогранный кубик

Код:
Развернуть Свернуть Копировать
var list = project.Lists["rand_str"].ToList();
int maxNumber = list.Count;
var pattern = "str";
var text = project.Variables["text_spin"].Value;
for (int i = 1; i <= 5; i++)
        {
list.Shuffle();
var randomStr0 =  string.Join("", list.Take(1).ToArray());
var n = new Random().Next(0,maxNumber);
var match = System.Text.RegularExpressions.Regex.Matches(text, pattern)[n];
text = text.Remove(match.Index, match.Length).Insert(match.Index, randomStr0);
        }
return text;

Большое спасибо что откликнулись.
Увы, но ваш вариант тоже выдаёт данную ошибку.
И ещё, у меня в исходном тексте, где нужно производить замены, расположены 172 макроса "str"
и в переменной n генерируется случайный порядковый номер макроса на замену, не могу понять зачем там list.Count
Может быть нужно делать исключения при генерации тех порядковых номеров, что уже заменены, что бы не возникало той ошибки. так?
 
Последнее редактирование:
У вас настолько запутанный алгоритм и странная реализация, что я не так понял.
Забудьте про мою корректировку, пусть она неправильная.

Давайте так:

Код:
Развернуть Свернуть Копировать
var list = project.Lists["rand_str"].ToList();
var pattern = "str";
var text = project.Variables["text_spin"].Value;
for (int i = 1; i <= 5; i++)
        {
list.Shuffle();
var randomStr0 =  string.Join("", list.Take(1).ToArray());
var matches = System.Text.RegularExpressions.Regex.Matches(text, pattern);
var n = new Random().Next(0,matches.Count);
text = text.Remove(matches[n].Index, matches[n].Length).Insert(matches[n].Index, randomStr0);
        }
return text;

Вы командовали «замени мне случайное совпадение в тексте в интервале от первого до 173-го», при том что количество совпадений могло быть и меньше. Теперь мы подсчитываем количество совпадений и выбираем случайное в этом интервале. То есть, если в тексте осталось две метки, то мы случайно выберем первую или вторую, но не 53-ю или 84-ую.
 
  • Спасибо
Реакции: gs517

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)