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

发布于 2024-08-31 05:03:18 字数 382 浏览 4 评论 0原文

如果我输入下面的代码,则会出现错误。基本上,当 foreach 遇到不是标签的 Control 时,它就会中断。

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

...
}

我必须做这样的事情。

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

    ...
    }

}

任何人都可以想出一种更好的方法来做到这一点,而无需我检查类型吗?我可以以某种方式让 foreach 跳过不是标签的对象吗?

If I enter the code below, I get an error. Basically, the foreach will break when it comes across a Control that isn't a label.

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

...
}

I have to do something like this.

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

    ...
    }

}

can anyone think of a better way of doing it without me needing to check the type? Can I somehow get foreach to skip the objects that aren't Labels?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

属性 2024-09-07 05:03:18

如果您使用的是 .NET 3.5 或更高版本,则可以执行类似这样的

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

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

If you're on .NET 3.5 or newer, you can do something like this

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

OfType<T> will ignore types that cannot be cast to T. See http://msdn.microsoft.com/en-us/library/bb360913.aspx

梦屿孤独相伴 2024-09-07 05:03:18

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 的子类,而您的原始代码则不包含这些子类。

Brian has given the most appropriate answer in terms of OfType. However, I wanted to point out that there's a better way of checking for types in cases where you do need to do it. Instead of your current code:

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

...
}

You can use:

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

or:

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

Note that both of these alternatives will also include subclasses of Label, which your original code doesn't.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文