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

Iterable extension case insensitive sorting

我从 复制过来所以答案使用了排序扩展。

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'.

你的扩展应该只应用于Iterable<String>,而不是任何可迭代的:

extension IterableX on Iterable<String> {
  Iterable<String> caseInsensitiveSortedBy() => toList()
    ..sort((a, b) => a.toUpperCase()
        .compareTo(b.toUpperCase()));
}

您不能对任何类型调用 toUpperCase