我可以使用foreach仅从集合中返回某种类型吗?

时间:2010-05-04 07:18:20

标签: c# collections foreach

如果我输入以下代码,我会收到错误消息。基本上,当遇到不是标签的Control时,foreach会中断。

foreach (Label currControl in this.Controls()) {

...
}

我必须做这样的事情。

foreach (Control currControl in this.Controls()) {
    if(typeof(Label).Equals(currControl.GetType())){

    ...
    }

}

有没有人能想到更好的方法,而不需要检查类型?我可以以某种方式获取foreach跳过不是标签的对象吗?

2 个答案:

答案 0 :(得分:10)

如果您使用的是.NET 3.5或更高版本,则可以执行此类操作

foreach(var label in this.Controls().OfType<Label>()) {
}

OfType<T>会忽略无法转换为T的类型。请参阅http://msdn.microsoft.com/en-us/library/bb360913.aspx

答案 1 :(得分:6)

Brian在OfType方面给出了最合适的答案。但是,我想指出,在需要这样做的情况下,有更好的方法来检查类型。而不是您当前的代码:

if(typeof(Label).Equals(currControl.GetType())){

...
}

您可以使用:

if (currControl is Label)
{
    Label label = (Label) currControl;
    // ...
}

或:

Label label = currControl as Label;
if (label != null)
{
    // ...
}

请注意,这两个替代方案都包含Label的子类,而您的原始代码却没有。