Модераторы: diadiavova, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ArrayList - в цикле просмотр и удаление (Remove), ArrayList - в цикле просмотр и удаление  
V
    Опции темы
ansen
Дата 25.4.2013, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.2.2003

Репутация: нет
Всего: нет



Создал коллекцию объектов ArrayList
Теперь пытаюсь в цикле пробегать по объектам и извлекать нужный и после чего удалить его
И так пока  ArrayList не станет пуст
Код

    Friend AllPointColections As New ArrayList()
..........
        Dim obj As [Object]
        For Each obj In AllPointColections
            pPntCol = obj
            ' нахожу по условию
            If pPntCol.Point(0).Compare(SavePntColectOfPgh.Point(SavePntColectOfPgh.PointCount - 1)) = 0 Then
                'сохраняю
                 SavePntColectOfPgh.AddPointCollection(pPntCol)
                ' И удаляю
                AllPointColections.Remove(pPntCol) 
            End If
        Next obj


Выдается ошибка после первого удаления: Collection was modified; enumeration operation may not execute.

Кто знает а как провести эту самую "enumeration operation"?
PM MAIL   Вверх
diadiavova
Дата 25.4.2013, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Нельзя внутри форич изменять коллекцию. Используй фор.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
ansen
Дата 25.4.2013, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.2.2003

Репутация: нет
Всего: нет



Заменил на

Код

        For i = 0 To AllPointColections.Count - 1

            pPntCol = AllPointColections(i) 
            .....................



И получил  Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
А  пробегать в обратном порядке (For n=Max to 0 step -1) нельзя
 
PM MAIL   Вверх
diadiavova
Дата 25.4.2013, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Ну это естественно, если ты удаляешь элемент, то их становится меньше и последний индекс окажется за пределами диапазона. Можно уменьшать счетчик при удалении элемента, но вообще задачу лучше бы решать более продвинутыми средствами.
Во-первых забудь об эррэйлист и используй джинерик-коллекции, такие как List(Of T).
Во-вторых, фильтрацию коллекции можно выполнить линк-запросом или вызовом соответствующей функции.
То есть в твоём случае надо создать коллекцию List(Of Point) (назовём её Pointlist), и отфильтровать так например
Код

Dim filteredcollection = Pointlist.Where(Function(p) <здесь условие фильтрации>)



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
ansen
Дата 25.4.2013, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.2.2003

Репутация: нет
Всего: нет



Попробовал " более продвинутыми средствами"...
Объявил
Код

Friend AllPointColections As List(Of ESRI.ArcGIS.Geometry.IPointCollection)

Где в качество запоминаемых объектов тоже являются специфические коллекции от  ESRI

И суть проблемы у меня не создавать какую-то фильтрацию, а выбрать ВСЕ элементы в непредсказуемой последовательности.
И процесс заканчивается при опустошении списка сам
А если не применять удаление выбранных, то нужно заморачиваться с какой-то структурой, где кроме объекта еще флажок, да еще счетчик и т. д.
А потом еще выгружать.
С успехом все это делал в VB6. А тут...

 " более продвинутое средство" выдает тоже самое :Collection was modified; enumeration operation may not execute. 

Хочу получить ответ по существу: Кто знает а как провести эту самую "enumeration operation"? 
Или это невыполнимо
PM MAIL   Вверх
diadiavova
Дата 25.4.2013, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(ansen @  25.4.2013,  17:22 Найти цитируемый пост)
" более продвинутое средство" выдает тоже самое :Collection was modified; enumeration operation may not execute.

Учитывая, что у тебя снова выпало то же самое исключение, могу предположить, что ты снова пытался изменять коллекцию в фориче, не смотря на то, что в первом посте я написал
Цитата(diadiavova @  25.4.2013,  15:11 Найти цитируемый пост)
Нельзя внутри форич изменять коллекцию.

Судя по всему продвинутым для тебя является средство, которое тебе это разрешило бы. Если бы ты читал внимательнее, то вероятно заметил бы, что говоря о продвинутом средстве я указал два пункта. После чего даже привел пример. 
Цитата(ansen @  25.4.2013,  17:22 Найти цитируемый пост)
И суть проблемы

Суть проблемы следует описывать в самом начале, а в данном случае мне пришлось догадываться что ты делаешь
Цитата(ansen @  25.4.2013,  17:22 Найти цитируемый пост)
А если не применять удаление выбранных, то нужно заморачиваться с какой-то структурой, где кроме объекта еще флажок, да еще счетчик и т. д.

Еще можно создать новую коллекцию и добавлять удаленные элементы в нее. Основную коллекцию обрабатывать в цикле While, где условием завершения будет именно опустошение списка.
Цитата(ansen @  25.4.2013,  17:22 Найти цитируемый пост)
С успехом все это делал в VB6. А тут...

А тут это запрещено


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 25.4.2013, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Код

        Dim rnd As New Random
        Dim mixedlist = AllPointColections.OrderBy(Function(x) rnd.Next)

Продвинутый способ перемешивания выглядит так.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
ansen
Дата 25.4.2013, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.2.2003

Репутация: нет
Всего: нет



Я "что-то плохо не понял" по поводу 
Цитата

Основную коллекцию обрабатывать в цикле While

Каким образом я буду бегать по списку?

И все таки:  перенумерацию (обновление,enumeration) списка можно сделать?

Предполагаю три ответа: Да, Нет  и Не знаю.
А последнее ах как мы не умеем говорить

Это сообщение отредактировал(а) ansen - 25.4.2013, 22:50
PM MAIL   Вверх
diadiavova
Дата 25.4.2013, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(ansen @  25.4.2013,  23:40 Найти цитируемый пост)
Я "что-то плохо не понял" по поводу 

 smile 
В последнем посте я предоставил тебе готовый код для копипасты. Этот код перемешивает коллекцию рандомно. Что еще надо? smile 
По поводу обработки в цикле, это просто решение "по-старинке" и в нем был бы смысл, если бы это нельзя было решить теми двумя строками, которые я показал. А по списку можно пробежать по индексу, получаемому рандомно.

Добавлено @ 22:58
Цитата(ansen @  25.4.2013,  23:40 Найти цитируемый пост)
А последнее ах как мы не умеем говорить

Научись сначала читать, что тебе ответили.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
ansen
Дата 25.4.2013, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.2.2003

Репутация: нет
Всего: нет



Нашел решение перенумерацию (обновление,enumeration) списка можно сделать!
Для этого нужно вывалится из цикла:

Код

        Do While AllPointColections.Count > 0
            For i = 0 To AllPointColections.Count - 1 
                pPntCol = AllPointColections(i) 
                If pPntCol.Point(0).Compare(SavePntColectOfPgh.Point(SavePntColectOfPgh.PointCount - 1)) = 0 Then
                    SavePntColectOfPgh.AddPointCollection(pPntCol)
                    AllPointColections.Remove(pPntCol) 
                    Exit For' выход, который и перенумерует
                End If
            Next 
        Loop



Добавлено @ 23:21
Мне перемешивать ничего не нужно! 
Тот же совет - научись читать!
Непредсказуемость выбора определяют определенные значения  элементов списка.
А элементы списка поступают как бог на душу положит! 

Это сообщение отредактировал(а) ansen - 25.4.2013, 23:24
PM MAIL   Вверх
diadiavova
Дата 25.4.2013, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(ansen @  26.4.2013,  00:15 Найти цитируемый пост)
Мне перемешивать ничего не нужно! 

И как это сообразуется с этим?
Цитата(ansen @  25.4.2013,  17:22 Найти цитируемый пост)
И суть проблемы у меня не создавать какую-то фильтрацию, а выбрать ВСЕ элементы в непредсказуемой последовательности.




--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
ansen
Дата 25.4.2013, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.2.2003

Репутация: нет
Всего: нет



"непредсказуемая последовательность" и "случайная(random) последовательность" не являются синонимами!
непредсказуемая - заранее неизвестная.

Это сообщение отредактировал(а) ansen - 25.4.2013, 23:30
PM MAIL   Вверх
diadiavova
Дата 25.4.2013, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Может просветишь, что же это за зверь такой эта твоя "непредсказуемая последовательность". Я так понимаю, что последовательность, сформированная случайным образом - предсказуемая. Ты это хочешь сказать?

Добавлено через 1 минуту и 53 секунды
Цитата(ansen @  26.4.2013,  00:28 Найти цитируемый пост)
заранее неизвестная

Что значит "заранее неизвестная". Что именно в ней неизвестно заранее? Уж не порядок ли следования элементов, так случайно?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
ansen
Дата 25.4.2013, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.2.2003

Репутация: нет
Всего: нет




Цитата

Непредсказуемость выбора определяют определенные значения  элементов списка

Т.е. пробегаю по списку и смотрю одно из значений элемента(у элемента, который тоже список их много). 
Удовлетворяет условию - использую определенным образом и удаляю. 
Это использование меняет условие выбора для следующего элемента и т.д. до полного обнуления списка.
Надеюсь все понятно.
 
Спасибо всем! smile 

Это сообщение отредактировал(а) ansen - 25.4.2013, 23:53
PM MAIL   Вверх
diadiavova
Дата 25.4.2013, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(ansen @ 26.4.2013,  00:43)
Спасибо всем! smile

И что это значит? smile 
Вот я набросал код с решением, представленным ранее. Здесь список чисел расположенный в порядке возрастания. Далее я его перемешиваю рандомно и вывожу на консоль. Повторяю это десять раз
Код

   Sub Main()

        Dim listofint As New List(Of Integer) From {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}
        Dim rnd As New Random
        For n = 0 To 10
            Dim mixed = listofint.OrderBy(Function(x) rnd.Next)
            For Each i In mixed
                Console.Write("{0} ", i)
            Next
            Console.WriteLine()
        Next

        Console.ReadKey()
    End Sub

Вот результат перемешивания
Код

11 1 9 4 3 2 7 12 5 8 14 10 13 6
13 14 9 11 12 3 8 6 10 5 1 2 7 4
7 9 10 8 1 5 3 6 4 2 12 13 14 11
4 7 12 6 5 1 11 2 10 8 9 14 3 13
3 1 6 4 11 12 9 7 14 5 13 10 8 2
7 6 13 3 10 2 14 9 8 1 5 11 12 4
9 8 4 6 12 13 5 14 10 11 2 1 7 3
2 1 11 8 9 10 14 6 5 3 13 7 12 4
7 5 10 1 3 12 8 13 14 4 2 9 6 11
3 1 11 14 6 9 4 12 7 2 8 5 13 10
9 11 8 6 13 1 2 5 12 14 4 7 3 10


Каждый вариант на новой строке. Теперь ответь, чем это отличается от непредсказуемой коллекции. smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1007 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.