在Dart中如何比较String和不区分大小写?

时间:2015-07-20 17:46:06

标签: dart

如何比较Dart中的两个字符串,不区分大小写?

例如,我有这个清单:

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

我想对其进行排序,appleBanana之前。

最终结果:

['apple', 'Banana'];

7 个答案:

答案 0 :(得分:7)

Dart中没有不区分大小写的字符串比较函数(或者字符串相等函数)。基本上因为它很难,而且没有一个好的解决方案我们想要修复。

问题是正确进行不区分大小写的比较的方法是使用完整的Unicode case-folding(http://www.w3.org/International/wiki/Case_folding)和一个(可能是特定于语言环境的)排序产生的Unicode字符。 Unicode字符可能占用多个代码点,并且可以具有不同的表示形式,因此您可能还需要执行其他Unicode规范化。

所以,它非常复杂,需要一个相当大的桌子。

如果您已经拥有完整的Unicode库,那就太好了,如果您想要编译成小的JavaScript代码,那就不那么好了。

即使您只使用ASCII,您仍然需要弄清楚您希望订购的内容。是Z< ^? (作为ASCII码,它们是)。是^< a?同样,作为ASCII码,它们是。但你可能不希望Z< a在不区分大小写的情况下进行比较,因此为了保持一致性,您需要转换为大写或小写,并选择哪一个将更改a^相互比较的方式。

collection包具有compareAsciiUpperCase功能(小写相似),package:quiver具有compareIgnoreCase功能,两者都有toLowerCase()功能参数。 您可以将其用作:

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

答案 1 :(得分:5)

没有内置的方法可以比较dart(as @lrn answered)中不区分大小写的字符串。

如果您只想比较不区分大小写的字符串,则可以在一个普通的地方声明以下方法:

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

答案 2 :(得分:3)

一种方法,你可以在sort()方法中大写你的字符串:

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

答案 3 :(得分:1)

您可以创建扩展功能:

extension StringExtensions on String {
  bool containsIgnoreCase(String secondString) => this.toLowerCase().contains(secondString.toLowerCase());

  //bool isNotBlank() => this != null && this.isNotEmpty;
}

用法:

if ("abcd".containsIgnoreCase("AB")) {
    //true
}

答案 4 :(得分:0)

您可以使用变通来解决您的问题,在将它们与情人案例进行比较之前,只需设置所有字符串

答案 5 :(得分:-1)

您可以使用Google自己的quiver strings软件包。它具有equalsIgnoreCase函数。这是它的实现:

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

答案 6 :(得分:-2)

我只是使用了内置的 .toLowerCase() 方法两次。我的用例是根据用户的搜索字符串创建一个子列表,如下所示:

_filteredItems = 
_items.where((element) => element.strTitle.toLowerCase().contains(_searchText.toLowerCase())).toList();