LINQ无法转换为'int?'

时间:2017-09-11 00:47:52

标签: c# list linq sorting

我正在尝试按多个标准排序,而我必须返回最昂贵的汽车的Id,如果有多辆汽车具有相同的值,则根据生产日期返回最新的汽车。

public int? Exercise7demo(List<Car> cars)
{
    if (cars == null)
    {
        return null;
    }
    else
    {
        List<Car> sorted = cars
            .OrderByDescending( x => x.SuggestedRetailPrice )
            .ThenBy( x => x.ManufacturedDate )
            .ToList();

        return sorted.ID;
    } 
}

它被卡住了,因为我无法理解为什么它不会返回“已排序”。我特意说“无法将类型System.Collections.Generic.List显式转换为'int?'

我错过了什么?请注意,我无法更改公共类型以使其工作,我已经想到了,但这是我正在进行的在线演示课程的一部分,因此这是设置。

编辑:我应该澄清ID是原始定义的,是公共int的一部分吗?声明(对不起,术语可能在这里)。出于某种原因,如果我试图在return语句中调用.ID,它表示它没有定义。那是因为我的List sorted = cars语句吗?

谢谢!

4 个答案:

答案 0 :(得分:4)

在排序条件之后,您已应用ToList(),这意味着您仍然可以获得List<Car>,而不是int

您必须将其更改为:

return sorted.FirstOrDefault().ID;

您可能还想检查任何空值,因此:

return sorted.FirstOfDefault()?.ID;

答案 1 :(得分:3)

您可以这样做:

return cars.OrderByDescending(x => x.SuggestedRetailPrice).ThenBy(x => x.ManufacturedDate).FirstOrDefault().ID;

您无需转换为列表。更重要的是,它可能会影响性能(来自MSDN):

  

ToList(IEnumerable)方法强制立即进行查询评估并返回包含查询结果的List。

因此,建议的方法可以解决您的问题,并使评估保持懒惰。

答案 2 :(得分:1)

你的排序是一个列表。为了返回顶部项目,您可以先使用它将返回第一个值。

试试这个

return sorted.First().ID;

答案 3 :(得分:0)

已排序是卡片列表,但您只需要列表中第一辆车的ID。所以使用:return sorted.First()。ID 它将返回列表中第一辆车的ID。