【问题标题】:Why do I need to cast a List<T> of a declared List<T> when passing through a Lambda OrderBy expression? [duplicate]为什么在通过 Lambda OrderBy 表达式时需要转换已声明 List<T> 的 List<T>? [复制]
【发布时间】:2020-11-15 21:15:45
【问题描述】:

所以我尝试使用 lambda 对我的对象列表进行排序,如下所示:

List<DirectoryObjects> sort = dirObjList.OrderBy(ms => ms.name);

Visual Studio 虽然说这是错误的,但它说这是正确的:

List<DirectoryObjects> sort = (List<DirectoryObjects>)dirObjList.OrderBy(ms => ms.name);

我以前接触过 lambda,但我从来没有真正理解过它。我的做法对我来说似乎是正确的,因为我的印象是 lambda 只是为我排序我的列表,但仍然保留它的类型。这样想有错吗?第二个实例看起来……对我来说是多余的。当它已经是这样时,为什么我需要转换一个排序列表?还是我应该将 lambdas 视为将 Enum 转换为不同类型的东西?

【问题讨论】:

  • 这能回答你的问题吗? OrderBy and List vs. IOrderedEnumerable
  • dirObjList.OrderBy(ms =&gt; ms.name).ToList() 这几乎应该作为错字关闭。也许你应该研究一下 IEnumerable 及其派生类和 List 的区别
  • Visual Studio though says that is wrong and it says this is correct: 要清楚,Visual Studio 从来没有说它是正确的。它可能会说它编译 - 但它肯定不是正确(对于correct 的任何有意义的定义)。

标签: c# list lambda


【解决方案1】:

lambda 本身在这里无关紧要,关键是 LINQ 行为。

OrderBy 扩展方法确实不按照您的想法对您的列表进行排序。相反,它使用排序结果创建一个新的、独立的IEnumerable&lt;T&gt;,而原始的保持不变。所以它不是List&lt;T&gt;,而是完全不同的类型,它唯一的能力是按照你要求的顺序进行枚举。

列表就是这样,还有更多的东西(现在无关紧要),但重要的是OrderBy 的返回值不是列表。正因为如此,提议的演员阵容也是错误的,因为您试图将IEnumerable&lt;T&gt; 转换为List&lt;T&gt;。一般来说,这些转换可能会或可能不会起作用,这取决于真正的底层类型(因为IEnumerable&lt;T&gt; 是一个接口,而List&lt;T&gt; 是一个具体的类),所以编译器允许它。在 LINQ 的 OrderBy 的特殊情况下,它肯定会失败,因为它根本不返回列表。

要实际获取列表,您可以使用另一种 LINQ 方法,ToList:

List<DirectoryObjects> sort = dirObjList.OrderBy(ms => ms.name).ToList();

这将迭代原始集合,根据需要对其进行排序,并将结果存储在新的List&lt;T&gt; 对象中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2017-04-19
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多