Как сравнить String с нечувствительностью к регистру, в Dart?

Как сравнить две строки в Dart с нечувствительностью к регистру?

Например, у меня есть этот список:

var list = ['Banana', 'apple'];

И я хотел бы отсортировать его таким образом, чтобы apple был до Banana.

Конечный результат:

['apple', 'Banana'];

Ответ 1

В Dart нет функции сравнения строк без учета регистра (или функции равенства строк). В основном потому, что это сложно, и нет единственного хорошего решения, которое мы бы хотели исправить.

Проблема заключается в том, что правильный способ сравнения без учета регистра состоит в том, чтобы использовать полное свертывание в Юникоде (http://www.w3.org/International/wiki/Case_folding) вместе с (возможно, для конкретной локали) порядком результирующих символов Юникода. Символы Unicode могут занимать несколько кодовых точек и могут иметь разные представления, поэтому вы, вероятно, также захотите выполнить другие нормализации Unicode.

Так что это ужасно сложно и требует довольно большого стола.

Прекрасно, если у вас уже есть полная библиотека Unicode, и менее здорово, если вы хотите скомпилировать небольшой код JavaScript.

Даже если вы просто используете ASCII, вам все равно придется выяснить, каким должен быть порядок. Есть Z & lt; ^? (Как ASCII коды, они есть). Есть ^ & lt; a? Опять же, как коды ASCII, они есть. Но вы, вероятно, не хотите Z & lt; a в сравнении без учета регистра, поэтому для согласованности вам нужно преобразовать в верхний или нижний регистр, и тот, который вы выберете, изменит отношение a и ^ друг к другу.

Пакет collection имеет функцию compareAsciiUpperCase (и аналогичную для нижнего регистра), а package:quiver имеет функцию compareIgnoreCase, которая просто выполняет toLowerCase() для обоих аргументов. Вы можете использовать это как:

import "package:collection/collection.dart";
...
   list.sort(compareAsciiUpperCase);

Ответ 2

Не существует встроенного способа сравнения строк без учета регистра в dart (, как ответил @lrn).

Если вы хотите сравнивать строки без учета регистра, я бы остановился на объявлении следующего метода где-то в обычном месте:

bool equalsIgnoreCase(String string1, String string2) {
  return string1?.toLowerCase() == string2?.toLowerCase();
}

Пример:

equalsIgnoreCase("ABC", "abc"); // -> true
equalsIgnoreCase("123" "abc");  // -> false
equalsIgnoreCase(null, "abc");  // -> false
equalsIgnoreCase(null, null);   // -> true

Ответ 3

Один из способов сделать это, вы можете в верхнем регистре использовать свои строки в методе sort():

list.sort((a, b) => a.toUpperCase().compareTo(b.toUpperCase()));

Ответ 4

Вы можете использовать собственный пакет строк Google. Он имеет функцию equalsIgnoreCase. И вот его реализация:

bool equalsIgnoreCase(String a, String b) =>
    (a == null && b == null) ||
    (a != null && b != null && a.toLowerCase() == b.toLowerCase());