Войти
ПрограммированиеФорумОбщее

C# List<> Как определить что коллекция в данный момент перебирается через foreach. Что бы понимать можно ли коллекцию модифицировать

Страницы: 1 2 3 4 5 Следующая »
#0
16:12, 14 дек. 2015

Здравствуйте!

Имея объект коллекции нужно понять перебирается ли в данный момент коллекция через foreach.
Можно и самому нахимичить, но имеется ли стандартный метод это узнать.

Это нужно что бы понимать можно ли коллекцию модифицировать.

List<int> list = new List<int>();
list.IsForEachProcess() - мне нужен такой метод

#1
16:18, 14 дек. 2015

используй lock, люк

C# разрушает мозг
#2
16:21, 14 дек. 2015

Mephisto std
> используй lock, люк
ты думаешь, у него где-то теоретически возможен второй поток?

#3
16:24, 14 дек. 2015

bazhenovc
> ты думаешь, у него где-то теоретически возможен второй поток?
Если это юнити (держу пари что так и есть) - то вполне возможно, он кажись автоматически параллелит некоторые скрипты

#4
16:28, 14 дек. 2015

Mephisto std
> Если это юнити
там ничего не параллелится.
Если только в корутине(а они тоже не параллельно выполняются) одновременно не используется.

Если не юнити, почитай в мсдн про потокобезопасность и List, возможно твоя проверка и ненужна.

#5
17:26, 14 дек. 2015

aRpi
> Имея объект коллекции нужно понять перебирается ли в данный момент коллекция
> через foreach.

Представь, что у некоего товарища есть знакомая проститутка. Как ему узнать, не пользуется ли ей кто-нибудь прямо сейчас? Чтобы "понимать можно ли ее использовать" (с) изменен.
Ответ очевиден: не пользоваться услугами проституток.

Я к тому, что это подозрительно звучит: пытаться модифицировать коллекцию, которую кто-то МОЖЕТ итерировать через foreach и ты об этом не знаешь. Очень сильно похоже на ошибку в архитектуре.

#6
18:00, 14 дек. 2015

dub
Подозрение на то что человек хочет перечислять лист в одном потоке, а в другом чтото с ним делать.
Весьма возможно что лист потокобезопасный, а это значит что например добавление элементов в одном потоке, корректно обработается форич в другом потоке, то есть добавленные элементы будут выданы итератором в текущем цикле цикле.

Но это теория, так как у меня никогда не было такой задачи и я фактически не проверял это предположение. Но потокобезопасность подразумевает и такие варианты.

#7
18:21, 14 дек. 2015

k119_55524
Вообще-то приложение упадет при попытке изменить коллекцию в фориче.

#8
19:15, 14 дек. 2015

Dampire
Да, Вы правы, вылетает исключение  :(

#9
19:23, 14 дек. 2015

потому для перебора нужно продублировать коллекцию (например, toArray). Тогда можно из основной коллекции удалять без проблем.
Как вариант можно создать отдельную коллекцию, toDelete, сохранять туда элементы, которые нужно удалить, и потом в отдельном
цикле поудалять их из основной коллекции.

#10
19:50, 14 дек. 2015

Чисто теоретически, сохраняя исходную постановку задачи, можно попробовать сделать свою коллекцию со своим итератором. Итератор в конструкторе увеличивал бы у родительской коллекции счетчик активных итераторов на единицу, а в методе Dispose уменьшал на единицу. Тогда по счётчику активных итераторов у коллекции можно было бы определить, используется ли коллекция в данный момент в foreach или нет.

Хотя всё равно потребуется какая-нибудь синхронизация: сейчас счётчик итераторов ноль и коллекцию изменять можно, а через наносекунду единица и уже нельзя.

#11
20:12, 14 дек. 2015

я lock-аю и пофиг.
в юнити все равно нечего так адски мультитредить, чтоб избегать лишней блокировки.
если речь о производительности, то это копейки по сравнению с самим использованием foreach

#12
22:40, 14 дек. 2015

aRpi
>Имея объект коллекции нужно понять перебирается ли в данный момент коллекция через foreach.
зачем? ладно был бы там Dictionary, с ним отдельный геморрой, но так у тебя List! почему бы просто не перевести всё на for ?

>Это нужно что бы понимать можно ли коллекцию модифицировать.
Коллекцию то можно модифицировать, итератор просто умрёт из-за того что version == Count у коллекции поменялось

#13
23:03, 14 дек. 2015

перебирай while'ом

#14
23:14, 14 дек. 2015

Feo
> зачем? ладно был бы там Dictionary, с ним отдельный геморрой, но так у тебя
> List! почему бы просто не перевести всё на for ?
Мне кажется это замедлит программу... да и некрасиво

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.