使用LINQ从列表中获取类型的对象

时间:2018-03-27 13:27:35

标签: c#

请参阅以下代码:

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

2 个答案:

答案 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列出。