Foreach演员跳过?

时间:2017-07-04 10:23:48

标签: c# foreach casting

我有一些<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="vehicleList"> <label> <input type="radio" name="vehicleList" id="two" value="1" />Two Wheeler </label> <label> <input type="radio" name="vehicleList" id="four" value="2" />Four Wheeler </label> </div> <h5>Output : </h5> <div id="TwoWheeler" style="display:none"> <label> <input type="radio" name="TwoWheeler" value="6" />Electric </label> <label> <input type="radio" name="TwoWheeler" value="7" />Petrol </label> </div> <div id="FourWheeler" style="display:none"> <label> <input type="radio" name="FourWheeler" value="1" />Electric </label> <label> <input type="radio" name="FourWheeler" value="2" />Petrol </label> <label> <input type="radio" name="FourWheeler" value="3" />Diesel </label> <label> <input type="radio" name="FourWheeler" value="4" />CNG </label> <label> <input type="radio" name="FourWheeler" value="5" />LPG </label> </div>个包含对象的列表,这些对象都来自List<Building> playersBuildings类,我遇到了一些对我来说非常不直观的东西。

以下代码:

Bulilding

尝试将foreach (Factory f in playersBuildings) { f.Update (deltaTime); } 的每个元素强制转换为playersBuildings并产生InvalidCastException错误。虽然它有一定道理,但在编写代码时我希望foreach只会省略与指定类型不匹配的元素。

我首先想到的是解决方案:

Factory

但我不想使用foreach (Building f in playersBuildings) { if ((f is Factory) == false) continue; (f as Factory).Update (deltaTime); } 关键字。每次我想用我的as做一些事情时,需要输入额外的+10个字符,其迭代令人沮丧。

是否有更优雅的方法可以跳过与正确类型不匹配的元素?

2 个答案:

答案 0 :(得分:7)

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

foreach (Factory f in playersBuildings.OfType<Factory>()) {
  f.Update(deltaTime);
}
可以使用?.运算符实现

Non-Linq 解决方案:

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

答案 1 :(得分:0)

由于您必须输入is,我们可以将其替换为as

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

这比您的仔细检查(isas

稍短