可迭代扩展不区分大小写排序
Posted
技术标签:
【中文标题】可迭代扩展不区分大小写排序【英文标题】:Iterable extension case insensitive sorting 【发布时间】:2021-08-13 00:29:13 【问题描述】:我从this SO 中复制,使用扩展名进行排序。
extension IterableX<E> on Iterable<E>
Iterable<E> sortedBy(Comparable key(E e)) =>
toList()..sort((a, b) => key(a).compareTo(key(b)));
我正在使用它按字母顺序排序,但想让它不区分大小写,我不能。
extension IterableX<E> on Iterable<E>
Iterable<E> caseInsensitiveSortedBy(Comparable key(E e)) => toList()
..sort((a, b) => key(a?.toUpperCase())
.compareTo(key(b?.toUpperCase())));
不允许,因为The method 'toUpperCase' isn't defined for the type '<unknown>'.
所以我在尝试
Iterable<E> caseInsensitiveSortedBy(Comparable key(E e)) => toList()
..sort((a, b) =>
key(a is String? ? a.toUpperCase() : a).compareTo(key(b is String? ? b.toUpperCase() : b)));
我得到The argument type 'Object?' can't be assigned to the parameter type 'E'.
【问题讨论】:
@pskink 我不明白 【参考方案1】:您的扩展应仅应用于Iterable<String>
,而不是任何可迭代的:
extension IterableX on Iterable<String>
Iterable<String> caseInsensitiveSortedBy() => toList()
..sort((a, b) => a.toUpperCase()
.compareTo(b.toUpperCase()));
你不能在任何类型上调用toUpperCase
。
【讨论】:
为什么在类型检查时不起作用,比如第三个选项? @user3808307 在您的示例中,您正在调用get
,它需要类型E
。当您执行.toUpperCase
时,您尝试调用get
的类型从E
更改为String
。尽管 you 知道 toUpperCase
只会在 E
是 String
时被调用,但 Dart 类型系统并不知道。这就是演员表的用途。因此,或者,您可以使用第三个选项并执行.toUpperCase() as E
。
@user3808307 我选择将扩展名限制为部分字符串,因为我没有密切关注您的第三个示例,但主要是因为将 caseInsensitiveSortedBy
作为通用扩展名没有意义因为它只对String
s 有意义。以上是关于可迭代扩展不区分大小写排序的主要内容,如果未能解决你的问题,请参考以下文章
MySQL / MariaDB 不区分大小写的排序规则仍然区分大小写吗?