【问题标题】:Dart: Sorting by length of a list in a list of listsDart:按列表列表中的列表长度排序
【发布时间】:2020-08-13 00:56:17
【问题描述】:

我想要一个接受列表列表的函数。它应该按列表中每个列表的长度对列表列表进行排序,无论其类型如何。

我以为我可以通过使用下面的函数来实现这一点,但我遇到了类型错误。 X is not a subtype of Y。据我了解,使用dynamic 意味着它可以采用任何类型,那么我做错了什么?

List<List<dynamic>> sortByLength(List<List<dynamic>> lss) {
  final newLss = List.from(lss);

  return newLss..sort((a, b) => a.length.compareTo(b.length));
}

【问题讨论】:

    标签: dart


    【解决方案1】:

    您的问题是您不小心将List&lt;List&lt;dynamic&gt;&gt; 转换为List&lt;dynamic&gt;,然后尝试将其返回为List&lt;List&lt;dynamic&gt;&gt; 而不进行强制转换。

    final newLss = List.from(lss);
    

    这有两个错误:

    1. 它使用List.from instead of List.of(或代替lss.toList()[...lss])。
    2. 它没有为List 指定显式类型。

    结合起来,这些错误使newLss 成为List&lt;dynamic&gt; 的类型。尝试返回 newLss 然后失败,因为将 List&lt;dynamic&gt; 转换为 List&lt;T&gt; 需要使用 List.cast 来更改元素类型。

    【讨论】:

    • 我选择了[...lss] 选项,目的只是为了克隆它以避免突变,我认为List.from 做到了。感谢指正!
    • List.from 确实进行了复制,但以动态类型的方式允许您进行向下转换,例如将仅包含整数的 List&lt;num&gt; 转换为 List&lt;int&gt; (fx.List&lt;int&gt;.from(listOfNum.where((x) =&gt; x is int &amp;&amp; x.isEven) )。这意味着它不能从参数中推断出列表元素的类型,你应该改写List&lt;List&lt;dynamic&gt;&gt;.from 使用List.of。后者适用于类型推断,但不能进行向下转换。
    猜你喜欢
    • 1970-01-01
    • 2021-03-24
    • 2018-08-30
    • 2019-06-14
    • 1970-01-01
    • 2021-05-30
    • 2021-10-23
    • 1970-01-01
    • 2019-12-19
    相关资源
    最近更新 更多