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

kle*_*neg 2 c# linq union

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

public class Vehicle
{
}

public class Car : Vehicle
{
}

public class Plane : Vehicle
{
}
Run Code Online (Sandbox Code Playgroud)

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

List<Vehicle> vehicles = cars.Union(planes);
Run Code Online (Sandbox Code Playgroud)

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

InB*_*een 5

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

var vehicles = cars.Cast<Vehcile>().Union(planes);
Run Code Online (Sandbox Code Playgroud)

bieng Union签名的原因如下:

Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)
Run Code Online (Sandbox Code Playgroud)

在你的代码,形成first编译器的原因指出TSourceCar,因此second有错误的类型; IEnumerable<Plane>而不是预期的IEnumerable<Car>.

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

  1. first是的IEnumerable<Car>,TSource 也可能 Car.
  2. second是不是IEnumerable<Car>,所以TSource不可能Car.
  3. 是否有一个共同的类型TSource,这样既IEnumerable<Car>IEnumerable<Plane>可隐式转换为IEnumerable<TSource>?是的Vehicle,因此TSourceVehicle.