You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动