C# 如何在排序时进行强制转换?

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

我有类车辆类:车辆继承自类:车辆,如下所示。我有一个列表,我想使用LINQ根据Car class(而不是车辆父类)的属性对其进行排序


有关如何执行此操作的任何帮助?

您必须将
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)