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

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# не разбираюсь, данный снип собрал при помощи гугла и кривых рук.
 

gs517

Client
Регистрация
18.05.2013
Сообщения
138
Благодарностей
15
Баллы
18
Никто не подскажет :(
 

Nick

Client
Регистрация
22.07.2014
Сообщения
1 983
Благодарностей
817
Баллы
113
надо просто считывать длину списка и кидать не слишком многогранный кубик

Код:
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;
 

gs517

Client
Регистрация
18.05.2013
Сообщения
138
Благодарностей
15
Баллы
18
надо просто считывать длину списка и кидать не слишком многогранный кубик

Код:
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
Может быть нужно делать исключения при генерации тех порядковых номеров, что уже заменены, что бы не возникало той ошибки. так?
 
Последнее редактирование:

Nick

Client
Регистрация
22.07.2014
Сообщения
1 983
Благодарностей
817
Баллы
113
У вас настолько запутанный алгоритм и странная реализация, что я не так понял.
Забудьте про мою корректировку, пусть она неправильная.

Давайте так:

Код:
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

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