【问题标题】:Why is this an invalid LINQ cast?为什么这是无效的 LINQ 演员表?
【发布时间】:2015-11-06 22:12:02
【问题描述】:

我将原始数据放入一个通用列表中。然后,我将根据该原始数据计算出的数据放入另一个通用列表中,这个列表:

private List<ItemTotalsAcrossMonths> itemTotalsAcrossMonthsList;

数据(原始数据和计算数据)需要按总购买量排序显示,所以我希望数据以这种方式排序。由于排序一个通用列表会返回另一个通用列表,我首先尝试将排序后的数据重新分配到原始通用列表中:

itemTotalsAcrossMonthsList = (List<ItemTotalsAcrossMonths>)itemTotalsAcrossMonthsList.OrderByDescending(x => 
x.TotalPurchases13);

...但我现在的道路显然是用善意铺成的,因为这个代码侧炸弹在我脸上爆炸:

我尝试将 val 放入同一类型的单独通用列表中:

private List<ItemTotalsAcrossMonths> itemTotalsAcrossMonthsList;
private List<ItemTotalsAcrossMonths> itemTotalsAcrossMonthsListSortedByTotalPurchasesDescending;
. . .
itemTotalsAcrossMonthsListSortedByTotalPurchasesDescending = (List<ItemTotalsAcrossMonths>)itemTotalsAcrossMonthsList.OrderByDescending(x => x.TotalPurchases13);

...但结果惊人地相似。

我需要做什么才能对通用列表进行排序?

【问题讨论】:

  • 你错过了ToList() 电话。

标签: c# linq generics generic-list iorderedenumerable


【解决方案1】:

您缺少 ToList() 调用。

LINQ 方法返回IEnumerable&lt;T&gt;,而不是List&lt;T&gt;,因此您不能假设接口的实现可转换为List&lt;T&gt;

您可以在 LINQ 查询上调用 ToList() 以获取包含结果的列表。

【讨论】:

    【解决方案2】:

    OrderByDescending 返回一个 OrderedEnumerable。您的类型是List。只需在 OrderByDescending 之后调用 ToList() 即可恢复您的类型。

    【讨论】:

      【解决方案3】:

      OrderByDescending 方法是一种 LINQ 方法。一般来说,LINQ 在IEnumerables 上工作,而不是Lists。您需要使用ToList() 方法从IEnumerable 创建一个列表:

      itemTotalsAcrossMonthsList.OrderByDescending(x => x.TotalPurchases13).ToList();
      

      【讨论】:

      • List 不是 IEnumerable 吗?
      • @PeterSchneider A ListIEnumerable,但从 LINQ 扩展方法返回的 IEnumerable 不是 List
      • 哦,我明白你的意思了——Linq 可以在上运行,结果是 IEnumerables。是的,这是有道理的。
      猜你喜欢
      • 2013-01-30
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多