2017-07-04 69 views
2

我有一个列表List<Building> playersBuildings包含所有来自Bulilding类的对象,我遇到了一些对我来说很不直观的东西。Foreach cast skip?

以下代码:

foreach (Factory f in playersBuildings) { 
    f.Update (deltaTime); 
} 

尝试的playersBuildings每个元素转换为Factory并产生InvalidCastException的错误。虽然它有一定的意义,但在编写代码时,我希望foreach会省略与指定类型不匹配的元素。

我的解决办法首先想到的是这样的:

foreach (Building f in playersBuildings) { 
    if ((f is Factory) == false) 
     continue; 
    (f as Factory).Update (deltaTime); 
} 

,但我不喜欢使用as关键字。每次我想在我的f下做一些事情时,需要输入额外的+10个字符,因为它的迭代令人沮丧。

有没有更优雅的方式来跳过不匹配正确类型的元素?

回答

7

我建议OfType()的LINQ方法过滤掉所有Factory实例:

foreach (Factory f in playersBuildings.OfType<Factory>()) { 
    f.Update(deltaTime); 
} 

非LINQ的解决方案可与?.操作来实现:

foreach (Building b in playersBuildings) { 
    (b as Factory)?.Update(deltaTime); 
} 
+1

这是值得注意的是,所有的'OfType'做引擎盖下是'is'测试,随后铸造。这不会改变这个答案的有效性(这是我会做的),只是指出OP,他几乎是在正确的轨道上,只是解决方案变得隐藏起来。 https://referencesource.microsoft.com/System.Core/R/58e46ed059174950.html – pinkfloydx33

0

正如你已经有了我们可以用as代替is

var q = f as Factory; 
if(q != null)  
    f.Update(deltaTime); 

这是短一点,然后你仔细检查(isas