C# 如何在排序时进行强制转换?
我有类车辆,类:车辆继承自类:车辆,如下所示。我有一个列表,我想使用LINQ根据Car class(而不是车辆父类)的属性对其进行排序C# 如何在排序时进行强制转换?,c#,.net,linq,sql-order-by,C#,.net,Linq,Sql Order By,我有类车辆,类:车辆继承自类:车辆,如下所示。我有一个列表,我想使用LINQ根据Car class(而不是车辆父类)的属性对其进行排序 有关如何执行此操作的任何帮助?您必须将c投射到汽车中,而不是c.ModelName 尝试: 最可读的代码是 vehicleList.Cast<Car>().OrderBy(c => c.ModelName); 也就是说,如果您的列表中有任何车辆不是汽车,上述两种情况都会发生。如果这不能实现,那么为什么那不是一个列表呢?尝试使用: vehicl
有关如何执行此操作的任何帮助?您必须将
c
投射到汽车中,而不是c.ModelName
尝试:
最可读的代码是
vehicleList.Cast<Car>().OrderBy(c => c.ModelName);
也就是说,如果您的列表中有任何车辆
不是汽车
,上述两种情况都会发生。如果这不能实现,那么为什么那不是一个列表呢?尝试使用:
vehicleList.OfType<Car>().OrderBy(c=>c.ModelName)
vehicleList.OfType().OrderBy(c=>c.ModelName)
注:
这只返回您列表中的汽车您必须决定想要什么:
Car
实例列表或Vehicle
实例列表
如果您想拥有车辆
实例的列表,您不能按车辆
的属性进行订购,因为在车辆
列表中也可能有公共汽车
或自行车
执行您当前尝试的操作(强制转换为Car
)可能会在运行时引发异常
话虽如此,如果你坚持这样做,你必须意识到两件事:
您需要修复您的强制转换:vehicleList.OrderBy(c=>((Car)c.ModelName)
您需要知道,OrderBy
不会执行就地排序<代码>车辆列表
仍将保持其原始顺序。如果要在vehiclelelist
中获得订购结果,需要将OrderBy
的结果分配给它:
vehicleList = vehicleList.OrderBy(c => ((Car)c).ModelName).ToList();
试试这个:
vehicleList.OrderBy(c=>((Car)c).ModelName)
但要小心,如果一件物品不是汽车,它会爆炸
解决这一问题的办法是:
vehicleList.OrderBy<Vehicle, string>(c=>
{
Car car = c as Car;
if (car != null)
return car.ModelName
else
return "";
}
vehicleList.OrderBy(c=>
{
Car Car=c作为Car;
if(car!=null)
return car.ModelName
其他的
返回“”;
}
但如果存在“非车辆”,则位置将由空字符串相对于列表中其他项目确定。vehicleList.OfType().OrderBy(c=>c.ModelName)
vehicleList.OfType<Car>().OrderBy(c=>c.ModelName)
如果你需要列表,为什么要使用列表呢?@TimSchmelter我正在处理一些遗留代码。并且限制正在改变:(但是如果你在车辆列表中有卡车,
,这将失败:(+1当然会。Jon和Daniel Hilgarth提供了更多详细信息。不过感谢你的投票:)请注意,使用of type
不会失败,但会改变语句的含义,因为它不会处理每辆车。这肯定应该是列表
,以确保正确的行为。如果车辆列表包含平面怎么办?在这种情况下,of type()将是安全的PS:I将始终在注释8之前更新)谢谢,这对我来说很有用。我正在对其他人的代码进行小的修改,并且在只有汽车对象存在的情况下,这是有保证的。我去Linq排序它是Orderby()的情况,然后是by。再次感谢!这与编写.OfType()相同
,只是更健谈。如果我的列表只包含汽车广告,演员阵容不会失败怎么办?@user2025418如果你的列表只包含汽车
对象,那么它首先应该是列表
,而不是列表
@Servy是的,这很有意义,但我正在尝试使用遗留代码,并且它有一个列表…将其更改为uld需要很多努力这看起来很有趣!那么我可以写下面的东西吗?vehicleList.OrderBy(c=>{Car Car=c as Car;if(Car!=null)return Car.ModelName;else if(c是plane)return plane.planeNumber;}它给出了错误:方法'System.Linq.Enumerable.OrderBy'的类型参数无法从用法中推断出(System.Collections.Generic.IEnumerable,System.Func)“。请尝试显式指定类型参数。
vehicleList = vehicleList.OrderBy(c => ((Car)c).ModelName).ToList();
vehicleList.OrderBy(c=>((Car)c).ModelName)
vehicleList.OrderBy<Vehicle, string>(c=>
{
Car car = c as Car;
if (car != null)
return car.ModelName
else
return "";
}
vehicleList.OfType<Car>().OrderBy(c=>c.ModelName)