Изменение коллекции , пока вы выполняете ее итерацию, - никогда хорошая идея. Если вы сделаете это, весь ад вырвется на свободу. (Предпочтительно, это вызовет какое-то исключение, но это жизнь ...)
Однако это не самая большая проблема в вашем коде. Самая большая проблема в том, что вы совершили смертный грех Руби: не зная Enumerable
. (Не волнуйтесь: каждый совершает этот грех. Все время.)
Если вы хотите отклонить все элементы из коллекции, которые удовлетворяют условию, есть метод для этого, и он называется именно так, как вы ожидаете: Enumerable#reject!
.
Итак, давайте очистим это, не так ли?
SAFE = ;
Что там делает точка с запятой? Похоже, вы перепутали C # и Ruby :-)
(О, а также, эта строка не делает ничего полезного, не так ли?)
return control if control.CyclesCount == 0;
Опять бесполезная точка с запятой.
control.Items.each{|item| control.Items.Remove(item) if item.Value.index('|').nil?};
Вот где это становится интересным:
control.Items.reject! {|item| item.Value.include?('|') }
Намного лучше, не правда ли?
return control;
Мне лично нравится зарезервировать ключевое слово return
для «чистых» методов (т. Е. Методов, которые не имеют побочных эффектов), поэтому я бы не стал использовать его здесь, поскольку код изменяет control.Items
, но выбор стиля. Сложив все это вместе, я бы написал так:
return control if control.cycles_count == 0
control.items.reject! {|item| item.value.include?('|') }
control
Примечание: у меня сейчас нет работающей установки IronRuby, поэтому я делаю несколько предположений, которые, к сожалению, не могу проверить:
- работает метод транслитерации имени (
CyclesCount
-> cycles_count
),
Value
- это какая-то String
или коллекция и
ListItemCollection
миксы в Enumerable
Последний должен иметь место, если ListItemCollection
реализует IEnumerable
(в противном случае я бы посчитал это ошибкой в IronRuby). Если ListItemCollection
не не реализует IEnumerable
(что я, вероятно, считаю ошибкой в ListItemCollection
), это все равно легко исправить:
class ListItemCollection; include Enumerable end
[Кстати: я бы также ввел метод cycles?
(или свойство bool HasCycles
на стороне .NET), чтобы вы могли избавиться от теста cycle_count == 0
.]