如何获取从公共类继承的两组对象的并集

时间:2017-05-03 14:30:17

标签: c# linq union

假设我有两个类,Plane和Car,它们都继承自Vehicle

public class Vehicle
{
}

public class Car : Vehicle
{
}

public class Plane : Vehicle
{
}

如何获取飞机列表和汽车列表并将它们合并到一个车辆列表中?我尝试了下面这个,但是在汽车上有一个错误,说最好的重载必须采用IEnumerable类型的接收器

List<Vehicle> vehicles = cars.Union(planes);

有没有比使用两个.Select循环更简单的方法来将所有对象强制转换为Vehicle?

1 个答案:

答案 0 :(得分:5)

您需要将枚举强制转换为公共基类型:

var vehicles = cars.Cast<Vehcile>().Union(planes);

Union签名的原因如下:

Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)

在您的代码中,表单first,编译器会推断TSourceCar,因此second的类型错误; IEnumerable<Plane>代替预期的IEnumerable<Car>

请记住,在类型推断中,如果推理出错,编译器将不会进行bactrack并尝试其他操作,也就是说,它不会执行以下操作:

  1. firstIEnumerable<Car>,因此TSource 可以 Car
  2. second不是IEnumerable<Car>,因此TSource不能是Car
  3. 是否存在共同类型TSource,以便IEnumerable<Car>IEnumerable<Plane>可以隐式转换为IEnumerable<TSource>?是的,Vehicle,因此TSourceVehicle