Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获得从公共类继承的两组对象的并集_C#_Linq_Union - Fatal编程技术网

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

C# 如何获得从公共类继承的两组对象的并集,c#,linq,union,C#,Linq,Union,假设我有两个类,Plane和Car,它们都继承自Vehicle public class Vehicle { } public class Car : Vehicle { } public class Plane : Vehicle { } 如何获取飞机列表和汽车列表,并将它们合并为一个车辆列表?我尝试了以下方法,但在汽车上出现了一个错误,即最好的过载必须采用IEnumerable类型的接收器 List<Vehicle> vehicles = cars.Union(planes

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

public class Vehicle
{
}

public class Car : Vehicle
{
}

public class Plane : Vehicle
{
}
如何获取飞机列表和汽车列表,并将它们合并为一个车辆列表?我尝试了以下方法,但在汽车上出现了一个错误,即最好的过载必须采用IEnumerable类型的接收器

List<Vehicle> vehicles = cars.Union(planes);
列出车辆=汽车.联合体(飞机);

有没有比使用两个更简单的方法。选择“循环”将所有对象强制转换为车辆?

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

var vehicles = cars.Cast<Vehcile>().Union(planes);
在您的代码中,表单
first
编译器推断出
TSource
Car
,因此
second
的类型错误
IEnumerable
而不是预期的
IEnumerable

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

  • first
    IEnumerable
    ,因此
    TSource
    可能是
    Car
  • second
    不是
    IEnumerable
    ,因此
    TSource
    不能是
    Car
  • 是否有一个通用类型
    TSource
    ,以便
    IEnumerable
    IEnumerable
    都可以隐式转换为
    IEnumerable
    ?是,
    Vehicle
    ,因此
    TSource
    Vehicle

  • 次要旁注:由于汽车不可能是飞机,因此您可以使用
    Concat
    而不是
    Union
    (除非列表本身应“不同”)
    Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)