请参阅以下代码:
public interface IVehicle {
}
public class Car : IVehicle {
}
public class Lorry : IVehicle {
}
以及下面的客户端代码:
var Vehicles = new List<IVehicle>();
Vehicles.Add(new Car());
Vehicles.Add(new Lorry());
var Vehicles2 = new List<IVehicle>();
Vehicles2.Add(Vehicles.OfType<Car>() as IVehicle);
在运行最后一行后,将空值添加到列表中。如何确保将汽车添加到列表中。
我从这里得到了我的想法:LINQ selection by type of an object。
答案 0 :(得分:2)
Car
内可能有很多List<IVehicle>
个项目,因此您必须使用AddRange
Vehicles2.AddRange(Vehicles.OfType<Car>());
使用Linq Where
Vehicles2.AddRange(Vehicles.Where(x => x.GetType() == typeof(Car)));
@fubo,保证只有每一个
如果总有一个而你只想用Add
添加一个,那么你也可以使用Single()
来选择Car
- 注意:Single()
会抛出异常如果没有一个项目。
Vehicles2.Add(Vehicles.OfType<Car>().Single());
答案 1 :(得分:0)
我会注意到实际问题是您正在向IEnumerable<Car>
投射IVehicle
。演员表面显然失败,as
运算符返回null
。
因此,正如其他人已经指出的那样,这里的解决方案是获取单个IVehicle
对象(例如通过.Single
或.First
),或者将整个序列添加到通过.AddRange
列出。