Ruby .each删除集合中的项目

Chr*_*ris 0 c# ironruby

我目前正在使用一个应用程序,它允许通过rub脚本添加和删除下拉列表中的项目.Ruby看起来像这样

SAFE = ;
return control if control.CyclesCount == 0;
control.Items.each{|item| control.Items.Remove(item) if item.Value.index('|').nil?};
return control;
Run Code Online (Sandbox Code Playgroud)

control是自定义用户控件,其Items是ListItemCollction.我正在通过单元测试运行,以使我的Ruby代码正确并遇到麻烦.我传入的ListItemColletion看起来像这样..

var lic = new ListItemCOllection {
  new ListItem {Text = "Item2", Value = "8"}, 
  new ListItem {Text = "Item1", Value = "1"},
  new ListItem {Text = "Item3", Value = "3|1"},
  new ListItem {Text = "Item4", Value = "4"},
  new ListItem {Text = "Item5", Value = "5|2"},
  new ListItem {Text = "Item6", Value = "6"}
}
Run Code Online (Sandbox Code Playgroud)

此代码似乎总是在items集合中留下3个项目,而不是将2个项目与管道放在一起.3取决于我放置项目的顺序(按此顺序,Item1,Item3,Item5左转)这使我相信它的删除被搞砸了.我还尝试了一个集合的副本,循环它,从原始中删除,以便我没有从我正在迭代的集合中删除.我是Ruby的忠实用户,所以对我很轻松......但我可以使用一些建议.

谢谢

joh*_*nes 5

不建议在迭代时更改数组.有一些迭代器的目的是更改数组.

a= [1,2,3]
b= [1,2,3]
a.delete_if { |x| x == 2 } # => [1,3]
b.reject! { |x| x == 2 } # => [1,3]
a # => [1,3]
b # => [1,3]
Run Code Online (Sandbox Code Playgroud)

Array#delete_if删除数组的元素.只有一点点不同Array#reject

a= [1,2,3]
b= [1,2,3]
a.delete_if { |x| false } # => [1,3]
b.reject! { |x| false } # => nil
a # => [1,2,3]
b # => [1,2,3]
Run Code Online (Sandbox Code Playgroud)

Array#delete_if总是返回剩余的数组.Array#reject!如果数组保持不变,则返回nil.

一些更多的modifiieng迭代器,不改变原始数组:

a= [1,2,3]
a.reject { |x| x == 2 } # => [1,3]
a # => [1,2,3]
Run Code Online (Sandbox Code Playgroud)

Array#reject 返回没有被拒绝元素的数组,但不修改原始数组.

a= [1,2,3]
a.select { |x| x != 2 } # => [1,2,3]
a # => [1,3]
Run Code Online (Sandbox Code Playgroud)

Array#select 返回仅包含所选元素的数组,但不修改原始数组.