Проблема с C# снипетом

mrgreyarbtr

Пользователь
Регистрация
01.10.2022
Сообщения
99
Благодарностей
30
Баллы
18
C#:
var list = project.Lists["text"];// Исходный список
            Random rand = new Random();
            StringBuilder strb = new StringBuilder();
            int j = 400; // j - количество строк, которое нужно взять.
            for (int i = 0; i < j; i++) //цикл для перебора строк
            {
                int r = rand.Next(list.Count); //задает рандом строки из общего кол-ва строк
                if (i + 1 == j)
                {
                    strb.Append(list[r]); //добавляет в массив полученную последнюю строку без ,
                }
                else
                {
                    strb.Append(list[r] + "\n"); //добавляет в массив полученную строку
                }
                list.RemoveAt(r); //удаляет строку
            }
            return strb.ToString();
использую такой спинет для взятия строк из списка и часто выходит по ошибке
Выполнение действия CSharp OwnCode. Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Имя параметра: index
что нужно исправить в коде, чтобы он работал нормально?
 
  • Спасибо
Реакции: djaga

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
549
Благодарностей
1 127
Баллы
93
C#:
var list = project.Lists["text"];// Исходный список
            Random rand = new Random();
            StringBuilder strb = new StringBuilder();
            int j = 400; // j - количество строк, которое нужно взять.
            for (int i = 0; i < j; i++) //цикл для перебора строк
            {
                int r = rand.Next(list.Count); //задает рандом строки из общего кол-ва строк
                if (i + 1 == j)
                {
                    strb.Append(list[r]); //добавляет в массив полученную последнюю строку без ,
                }
                else
                {
                    strb.Append(list[r] + "\n"); //добавляет в массив полученную строку
                }
                list.RemoveAt(r); //удаляет строку
            }
            return strb.ToString();
использую такой спинет для взятия строк из списка и часто выходит по ошибке
Выполнение действия CSharp OwnCode. Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Имя параметра: index
что нужно исправить в коде, чтобы он работал нормально?
Ошибка в том, что вы удаляете строки из списка который и пересчитываете.
А значит где-то вы стакнетесь с тем, что строки уже нет в списке.

Попробуйте два варианта:

using'и: using System.Linq;
C#:
var list = project.Lists["text"]; // Исходный список
Random rand = new Random();
int j = Math.Min(400, list.Count); // j - количество строк, которое нужно взять.

var result = Enumerable.Range(0, j)
    .Select(_ =>
    {
        int r = rand.Next(list.Count);
        var item = list[r];
        list.RemoveAt(r);
        return item;
    })
    .Aggregate((s1, s2) => s1 + "\n" + s2);

return result;

C#:
var list = project.Lists["text"]; // Исходный список
Random rand = new Random();
StringBuilder strb = new StringBuilder();
int j = Math.Min(400, list.Count); // j - количество строк, которое нужно взять.
int i = 0;

while (i < j && list.Count > 0) // цикл для перебора строк
{
    int r = rand.Next(list.Count); // задает рандом строки из общего кол-ва строк
    if (i + 1 == j)
    {
        strb.Append(list[r]); // добавляет в массив полученную последнюю строку без ,
    }
    else
    {
        strb.Append(list[r] + "\n"); // добавляет в массив полученную строку
    }
    list.RemoveAt(r); // удаляет строку
    i++; // увеличиваем счетчик строк
}

return strb.ToString();
 

mrgreyarbtr

Пользователь
Регистрация
01.10.2022
Сообщения
99
Благодарностей
30
Баллы
18
Ошибка в том, что вы удаляете строки из списка который и пересчитываете.
А значит где-то вы стакнетесь с тем, что строки уже нет в списке.

Попробуйте два варианта:

using'и: using System.Linq;
C#:
var list = project.Lists["text"]; // Исходный список
Random rand = new Random();
int j = Math.Min(400, list.Count); // j - количество строк, которое нужно взять.

var result = Enumerable.Range(0, j)
    .Select(_ =>
    {
        int r = rand.Next(list.Count);
        var item = list[r];
        list.RemoveAt(r);
        return item;
    })
    .Aggregate((s1, s2) => s1 + "\n" + s2);

return result;

C#:
var list = project.Lists["text"]; // Исходный список
Random rand = new Random();
StringBuilder strb = new StringBuilder();
int j = Math.Min(400, list.Count); // j - количество строк, которое нужно взять.
int i = 0;

while (i < j && list.Count > 0) // цикл для перебора строк
{
    int r = rand.Next(list.Count); // задает рандом строки из общего кол-ва строк
    if (i + 1 == j)
    {
        strb.Append(list[r]); // добавляет в массив полученную последнюю строку без ,
    }
    else
    {
        strb.Append(list[r] + "\n"); // добавляет в массив полученную строку
    }
    list.RemoveAt(r); // удаляет строку
    i++; // увеличиваем счетчик строк
}

return strb.ToString();
бывают моменты когда строк остается меньше чем 400 и выходит по ошибке, если их осталось меньше, можно как-то взять?
 

Ахилес

Client
Read only
Регистрация
11.11.2020
Сообщения
956
Благодарностей
392
Баллы
63
  • Спасибо
Реакции: djaga

mrgreyarbtr

Пользователь
Регистрация
01.10.2022
Сообщения
99
Благодарностей
30
Баллы
18
  • Спасибо
Реакции: djaga

sambukanuka

Client
Регистрация
17.09.2019
Сообщения
287
Благодарностей
97
Баллы
28
Ошибка "Индекс за пределами диапазона" возникает, когда вы пытаетесь обратиться к элементу списка по индексу, который выходит за пределы его допустимого диапазона. Чтобы исправить эту ошибку, вам нужно проверить, что индекс находится в допустимом диапазоне перед доступом к элементу списка.
В вашем коде у вас используется метод RemoveAt, который изменяет размер списка, поэтому вам нужно учитывать изменение размера при выборе случайного индекса. Вот исправленный код:
C#:
var list = project.Lists["text"];
Random rand = new Random();
StringBuilder strb = new StringBuilder();
int j = Math.Min(400, list.Count); // Ограничиваем j максимальным значением, чтобы не выйти за пределы списка
for (int i = 0; i < j; i++)
{
    int r = rand.Next(list.Count);
    if (i + 1 == j)
    {
        strb.Append(list[r]);
    }
    else
    {
        strb.Append(list[r] + "\n");
    }
    list.RemoveAt(r);
}
return strb.ToString();
В этой версии кода я использую Math.Min(400, list.Count) для выбора меньшего значения между 400 и количеством элементов в списке, чтобы убедиться, что j не превышает размер списка. Также обратите внимание, что я использую list.Count вместо сохранения его в отдельной переменной, чтобы учесть изменение размера списка при удалении элементов.CopyCopyCopyCopy
Теперь код будет работать без ошибок "Индекс за пределами диапазона" и обрабатывать случай, когда j превышает размер списка.
 

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 617
Благодарностей
1 215
Баллы
113
Уже по форме ответа видно, что копипаст из ChatGPT ))
OFFTOP: Мне недавно так один "фрилансер" какой-то код писал, часа полтора с ним общался, он сам не проверял, но "мамой клялся, что все должно работать" ))) Я в итоге задолбался и сам все уточнил у ИИ, сам все поправил. Я даже не против, когда кто-то за меня от ChatGPT добивается результата, даже готов за это платить, это тоже время (не всегда результат сразу правильный)... Но, блин, когда кто-то просто "на авось" становится прокладкой, глядишь, сработает, денег заработаю, начинает малек утомлять ))) И сейчас таких "кодеров" во фрилансе - дофига )))
 
  • Спасибо
Реакции: djaga

sambukanuka

Client
Регистрация
17.09.2019
Сообщения
287
Благодарностей
97
Баллы
28
Уже по форме ответа видно, что копипаст из ChatGPT ))
OFFTOP: Мне недавно так один "фрилансер" какой-то код писал, часа полтора с ним общался, он сам не проверял, но "мамой клялся, что все должно работать" ))) Я в итоге задолбался и сам все уточнил у ИИ, сам все поправил. Я даже не против, когда кто-то за меня от ChatGPT добивается результата, даже готов за это платить, это тоже время (не всегда результат сразу правильный)... Но, блин, когда кто-то просто "на авось" становится прокладкой, глядишь, сработает, денег заработаю, начинает малек утомлять ))) И сейчас таких "кодеров" во фрилансе - дофига )))
да гпт) плохо чтоли?)
 

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
314
Баллы
63
Если это не критично, когда есть обьем, то это заворачивается в try/ catch
Где
Try
{
..ваш код
}
Catch // игнорирование ошибки
{
continue;
}
....
Повторюсь - если вам нужен "пролет" ошибок и несовпадений и ваш код в цикле
 

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