【问题标题】:LINQ can't convert to 'int?'LINQ 无法转换为“int?”
【发布时间】:2025-12-15 18:25:01
【问题描述】:

我正在尝试按多个标准进行排序,而我必须返回最昂贵汽车的 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 声明吗?

谢谢!

【问题讨论】:

  • 您发布的代码未返回List&lt;Car&gt;。这个.ID 属性在哪里定义?它也不是List&lt;Car&gt; 的成员。
  • 见下面的评论。我想我已经覆盖了原来的 List 车,所以不再定义 ID?
  • 如果您阅读您的代码,您有一个Car 的列表,并且您正在尝试获取特定Car 的ID。如果我给你一张写在纸上的汽车清单,然后问“汽车”的ID,你会看着我糊涂吧?
  • 我想你误会了。我在 EDIT 中添加了澄清信息

标签: c# list linq sorting


【解决方案1】:

在排序条件之后,您已经应用了ToList(),这意味着您仍然会得到List&lt;Car&gt;,而不是int

您必须将其更改为:

return sorted.FirstOrDefault().ID;

您可能还想检查任何空值,所以:

return sorted.FirstOfDefault()?.ID;

【讨论】:

    【解决方案2】:

    你可以这样做:

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

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

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

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

    【讨论】:

    • 这是我最初尝试过的,但由于在末尾附加 .List() 而被绊倒了。谢谢!
    【解决方案3】:

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

    这样试试

    return sorted.First().ID;
    

    【讨论】:

    • 感谢您的建议。它表示当前列表中未定义“ID”。我是否犯了一个错误,创建了一个与公开声明中的初始列表同名的列表?
    • 表示列表中没有属性名称ID
    • 但如果我能早点使用 ID 的定义,在我重新定义 List 汽车之前。我知道它是最初定义的。
    【解决方案4】:

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

    【讨论】: