Могу ли я использовать foreach для возврата только определенного типа из коллекции? - PullRequest
5 голосов
/ 04 мая 2010

Если я введу код ниже, я получу ошибку. По сути, foreach сломается, когда наткнется на элемент управления, который не является меткой.

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

...
}

Я должен сделать что-то вроде этого.

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

    ...
    }

}

Кто-нибудь может придумать лучший способ сделать это без меня, чтобы проверить тип? Могу ли я как-то получить foreach, чтобы пропустить объекты, которые не являются метками?

Ответы [ 2 ]

10 голосов
/ 04 мая 2010

Если вы используете .NET 3.5 или новее, вы можете сделать что-то вроде этого

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

OfType<T> будет игнорировать типы, которые нельзя привести к T. См. http://msdn.microsoft.com/en-us/library/bb360913.aspx

6 голосов
/ 04 мая 2010

Брайан дал наиболее подходящий ответ с точки зрения OfType. Тем не менее, я хотел бы отметить, что есть лучший способ проверки типов в тех случаях, когда вам нужно сделать это. Вместо вашего текущего кода:

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

...
}

Вы можете использовать:

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

или

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

Обратите внимание, что обе эти альтернативы также включают подклассы Label, чего нет в исходном коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...