可迭代扩展不区分大小写排序

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 '&lt;unknown&gt;'.

所以我在尝试

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&lt;String&gt;,而不是任何可迭代的:

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 作为通用扩展名没有意义因为它只对Strings 有意义。

以上是关于可迭代扩展不区分大小写排序的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据库区分大小写吗?

SQL Server 不区分大小写的排序规则

MySQL / MariaDB 不区分大小写的排序规则仍然区分大小写吗?

向 PostgreSQL 添加不区分大小写的排序规则

在 QAbstractItemModel 中不区分大小写排序

firebird 设置不区分大小写的排序规则