我在用foreach的时候遇到过这样的问题:
我在一个WINFORM中加了个菜单,菜单的下拉列表里除了有ToolStripMenuItem,还有分隔线(ToolStripSeparator)
具体代码如下:
foreach (ToolStripMenuItem item0 in MainMenuStrip.Items)
{
foreach (ToolStripMenuItem item1 in item0.DropDownItems)
{
MessageBox.Show(item1.Text); //在迭代到ToolStripSeparator时会出错
}
}
我看了一下它们的继承关系,ToolStripSeparator派生于ToolStripItem,而 ToolStripMenuItem 派生于ToolStripDropDownItem,而ToolStripDropDownItem 派生于 ToolStripItem
,简单点说,ToolStripSeparator 和ToolStripMenuItem 都是派生于ToolStripItem
而item0.DropDownItems 就是一个ToolStripItemCollection(ToolStripItem的集合)
难道说 foreach (ToolStripMenuItem item1 in item0.DropDownItems)这里迭代的是item0.DropDownItems的数量
或者说foreach 里面迭代的次数是in 后面的集合里(DropDownItems)的数量,而不是集合(DropDownItems)中ToolStripMenuItem 的数量????????
这个让我觉得很奇怪,是微软故意设置成这样的还是有什么特别的原因,请高手告诉我.
我在一个WINFORM中加了个菜单,菜单的下拉列表里除了有ToolStripMenuItem,还有分隔线(ToolStripSeparator)
具体代码如下:
foreach (ToolStripMenuItem item0 in MainMenuStrip.Items)
{
foreach (ToolStripMenuItem item1 in item0.DropDownItems)
{
MessageBox.Show(item1.Text); //在迭代到ToolStripSeparator时会出错
}
}
我看了一下它们的继承关系,ToolStripSeparator派生于ToolStripItem,而 ToolStripMenuItem 派生于ToolStripDropDownItem,而ToolStripDropDownItem 派生于 ToolStripItem
,简单点说,ToolStripSeparator 和ToolStripMenuItem 都是派生于ToolStripItem
而item0.DropDownItems 就是一个ToolStripItemCollection(ToolStripItem的集合)
难道说 foreach (ToolStripMenuItem item1 in item0.DropDownItems)这里迭代的是item0.DropDownItems的数量
或者说foreach 里面迭代的次数是in 后面的集合里(DropDownItems)的数量,而不是集合(DropDownItems)中ToolStripMenuItem 的数量????????
这个让我觉得很奇怪,是微软故意设置成这样的还是有什么特别的原因,请高手告诉我.
foreach (ToolStripMenuItem item1 in item0.DropDownItems)
这句用的是DropDownItems的数量进行的迭代,而不是DropDownItems中ToolStripMenuItem 的数量进行迭代的
{
foreach (ToolStripMenuItem item1 in item0.DropDownItems)
{
MessageBox.Show(item1.Text); //在迭代到ToolStripSeparator时会出错
}
}item0 是在 MainMenuStrip.Items 其中。
item1 是在 item0.DropDownItems 其中。
{
foreach (ToolStripMenuItem item1 in item0.DropDownItems)
{
MessageBox.Show(item1.Text); //在迭代到ToolStripSeparator时会出错
}
}
foreach (ToolStripMenuItem item1 in item0.DropDownItems) 中迭代的是item0.DropDownItems的数量,而不是item0.DropDownItems
中ToolStripMenuItem 的数量,为什么MS要这样做,还有就是,我要只迭代ToolStripMenuItem 的话,除了在foreach中做判断还能有什么好方法!
Yes, but ToolStripSeparator is NOT a ToolStripMenuItem.
是的,错误原因,我知道,我只是想深究一下foreach的具体工作原理,或者说,MS为什么要这样
在迭代一个同时拥有派生于同一个基类的不同子类集合时,迭代的次数为什么是集合的总数量而不是集合中迭代的子类的数量
foreach (ToolStripMenuItem item1 in item0.DropDownItems) 中迭代的是item0.DropDownItems的数量,而不是item0.DropDownItems
中ToolStripMenuItem 的数量
嗯,这样的话,foreach中也是要遍历in后面集合中所有的元素,那它是怎么能达到比for()语句效率更高的呢,我看过的一些书或者文章好像都是说的foreach要比for()的效率要高些,如果不是也请说说它们的差别
foreach (ToolStripMenuItem item1 in item0.DropDownItems)
这句用的是DropDownItems的数量进行的迭代,而不是DropDownItems中ToolStripMenuItem 的数量进行迭代的