使用LINQ OfType获取Car对象时添加空值,如何确保正确添加?
解决LINQ筛选指定类型对象后添加到列表的问题
咱们先搞清楚为啥最后会添加空值:你用的Vehicles.OfType<Car>()返回的不是单个Car对象,而是一个**IEnumerable<Car>类型的序列**——它代表了列表里所有符合Car类型的元素集合。当你试图把这个序列用as IVehicle转换成单个IVehicle实例时,因为IEnumerable<Car>根本不实现IVehicle接口,转换自然失败,结果就是null,所以Vehicles2里才会加进去空值。
接下来分两种场景给你解决办法:
场景1:只需要添加第一个匹配的Car对象
如果你只需要列表里的第一个Car,用FirstOrDefault()(如果不确定有没有Car,用这个会返回null;如果确定一定有,可以用First())提取单个实例,再添加:
// 提取第一个Car,没有的话返回null var targetCar = Vehicles.OfType<Car>().FirstOrDefault(); // 可选:判断非空再添加,避免加入null if (targetCar != null) { Vehicles2.Add(targetCar); }
或者更简洁的写法(直接添加,允许没有Car时加入null):
Vehicles2.Add(Vehicles.OfType<Car>().FirstOrDefault());
场景2:把所有Car对象都添加到Vehicles2
如果要把列表里所有的Car都加进去,别用Add()(它只接受单个元素),改用AddRange()来批量添加整个序列:
// 把所有筛选出来的Car一次性添加到Vehicles2 Vehicles2.AddRange(Vehicles.OfType<Car>());
因为Car本身实现了IVehicle,所以IEnumerable<Car>可以直接被AddRange()接受,所有Car实例都会被正确添加进去。
另外补充下:OfType<T>的核心作用是从源集合中筛选出类型为T的元素,返回的是一个元素序列,而不是单个元素,这是你一开始踩坑的关键点哦~
内容的提问来源于stack exchange,提问作者w0051977




