我有一些<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个字符,其迭代令人沮丧。
是否有更优雅的方法可以跳过与正确类型不匹配的元素?
答案 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);
这比您的仔细检查(is
和as
)