C# Index was out of range - ошибка при чистке списка

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
Обычная задача: есть список с фразами (result) и ключ (key).
Нужно удалить все строки со списка содержащие любое слово из ключа, если это слово длиннее трёх символов.
Решаю так:
Код:
var list = project.Lists["result"];
string str = "";
string keyword = "";
string text = project.Variables["key"].Value;
string[] words = text.Split(' ');
int value = list.Count;
for (int i = 0; i < list.Count; i++) {
    str = list[i];
    for (int j = 0; j < words.Length; j++) {
        keyword = words[j];
        if (keyword.Length > 3 && str.Contains(keyword)) {
            list.RemoveAt(i);
        }
    }
}
Но почему-то получаю ошибку. Самое интересное, если запустить кубик повторно по тому же списку, то уже ошибки нет.
Наверное что-то с некорректным удалением строки?
Код:
Выполнение действия CSharp OwnCode Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
потому что ты удаляешь со списка строки а счётчик не уменьшаешь, в этом случае лучше брать с низу
 
  • Спасибо
Реакции: Astraport

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
Так вроде list.Count же тоже уменьшается и в каждой итерации просчитывается.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
Так вроде list.Count же тоже уменьшается и в каждой итерации просчитывается.
list.Count это общее количество цикла, например count равен 10, ты удаляешь со списка строку там уже 9, а цикл у тебя 10, такого индекса нет в списке, как то так )
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113
@ssXXXss правильно говорит, тут нужно идти от большего элемента (i = list.Count-1) к меньшему (i >= 0) с уменьшением (i--)
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
попробуй так
C#:
var list = project.Lists["result"];
string text = project.Variables["key"].Value;
string[] words = text.Split(' ');

for(int i = list.Count-1; i >= 0; i--)
{
    var str = list[i];
    for (int j = 0; j < words.Length; j++)
    {
        var keyword = words[j];
        if (keyword.Length > 3 && str.Contains(keyword))
        {
            list.RemoveAt(i);
        }
    }
}
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
Ну хорошо, обратный цикл (на уменьшение) тоже выдает такую же ошибку.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
Код:
if (words.Length == 0 || list.Count == 0) {
    return -1;
}
Ставлю, не выходит по ошибке.
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
Код:
<p>wedding guest dresses</p><p>party dresses</p><p>long sleeve cocktail dresses</p><p>maxi dresses</p><p>nordstrom dresses</p><p>dress barn</p><p>women's dresses for weddings</p><p>women's special occasion dresses</p><p>dresses for juniors</p><p>jcpenney dresses</p><p>dresses for prom</p><p>women's casual dresses</p><p>dresses to wear to a wedding</p><p>midi cocktail dress</p><p>neiman marcus cocktail dresses</p><p>midi dresses with 3/4 length sleeves</p><p>cocktail dresses with sleeves</p><p>cocktail dresses for weddings</p><p>mothers day dresses</p><p>kohls dresses formal</p><p>women's summer dresses</p><p>women's cocktail dresses</p><p>spring dresses</p><p>spring 2015 wedding guest fashion</p><p>summer wedding guest fashion</p><p>cute summer wedding guest dresses</p><p>2015 wedding guest attire</p><p>wedding party dresses for mother of groom</p><p>mother of the groom dresses</p><p>macy's wedding party dresses</p><p>plus size wedding party dresses</p><p>inexpensive wedding party dresses</p><p>wedding party dresses for sale</p><p>wedding event dresses</p><p>cocktail dress</p><p>formal dresses</p><p>rent the runway</p><p>david's bridal</p><p>lulus</p><p>windsor</p><p>fall wedding guest dresses</p><p>cocktail dress wedding</p><p>wedding guest dresses for summer</p><p>wedding guest dresses plus size</p><p>wedding guest dresses for spring</p><p>10 best celebrity wedding guest dresses</p><p>wedding guest dresses 2016</p><p>wedding guest dresses canada</p><p>summer wedding guest dresses 2015</p><p>wedding guest dresses 2015</p><p>summer wedding guest dresses</p><p>wedding dresses 2015 summer</p><p>wedding party dresses</p><p>dresses wedding party</p><p>purple wedding party dresses</p><p>wedding party dresses for women</p><p>evening dresses wedding party</p><p>mother of the bride dresses</p><p>wedding suit with silver inserts and sequins</p><p>macys dresses</p>
Вот для конкретики данные для списка (распарсить (?<=<p>).*?(?=</p>))
И вот ключ: macys dresses
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
пробуй
C#:
var list = project.Lists["result"];
string text = project.Variables["key"].Value;
string[] words = text.Split(' ');

for(int i = list.Count-1; i >= 0; i--)
{
    var str = list[i];
    for (int j = 0; j < words.Length; j++)
    {
        var keyword = words[j];
        if (keyword.Length > 3 || str.Contains(keyword))
        {
            list.RemoveAt(i);
            break;
        }
    }
}

return string.Join("...", list);
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
  • Спасибо
Реакции: Astraport

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
Вот, теперь я понял! Спасибо.
Второй цикл удаляет строки несколько раз, точно - нужен был break.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
упс.. там оказывается у тебя проверка на длину стояла по ключу и я чёт не обратил внимание, вот он и удаляет всё
пробуй )
C#:
var list = project.Lists["result"];
string text = project.Variables["key"].Value;
string[] words = text.Split(' ');

for(int i = list.Count-1; i >= 0; i--)
{
    var str = list[i];
    for (int j = 0; j < words.Length; j++)
    {
        var keyword = words[j];
        if (str.Length > 3 && str.Contains(keyword))
        {
            list.RemoveAt(i);
            break;
        }
    }
}

return string.Join("...", list);
вот мой результат

2018-02-01_232644.png

удалило aaaa, правильно ?
 
  • Спасибо
Реакции: Astraport

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
Да, я понял ошибку, спасибо. Волшебный break)
 

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