带有字符串键的 Dart Map,与忽略大小写进行比较

Dart Map with String key, compare with ignore case

如果键是字符串,Dart 中的 Map class 是否有忽略大小写的方法?

例如

var map = new Map<String, int>(/*MyComparerThatIgnoresCase*/);
map["MyKey"] = 42;
var shouldBe42 = map["mykey"];

在 C# 中,Dictionary 构造函数采用与上述注释类似的比较器。在 Dart 中执行此操作的规范方法是什么?

Dart 中的映射具有比较键是否相等的内部方法。据我所知,您无法将其更改为默认 Map class。但是,您可以使用非常相似的内核 LinkedHashMap class,它不仅允许,而且要求您指定一个键相等方法。您可以在 https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:collection.LinkedHashMap

查看更多关于 LinkedHashMaps 的信息
LinkedHashMap<String, String> map = new LinkedHashMap(
    (a, b) => a.toLowerCase() == b.toLowerCase(),
    (key) => key.toLowerCase().hashCode
);

map['Foo'] = 'bar';
print(map['foo']);   //bar

使用自定义 equals 函数(以及相应的自定义 hashCode 函数)创建 HashMap 的方法是在 HashMap 构造函数上使用可选参数:

new HashMap<String,Whatever>(equals: (a, b) => a.toUpperCase() == b.toUpperCase(),
                             hashCode: (a) => a.toUpperCase().hashCode);

我真的非常推荐找到一种方法,不要在每次操作时都执行 toUpperCase!

您也可以使用 package:collectionCanonicalizedMap class 来执行此操作。此 class 明确设计用于支持具有 "canonical" 版本键的映射,并且比将自定义相等性和哈希码方法传递给普通 Map.

稍微高效一些

Dart 有一个漂亮的地方 CaseInsensitiveEquality().equals(String a, String b) 在他们的 import 'package:collection/collection.dart'; 它 returns 是一个布尔值,在我将字符串转换回枚举时对我非常有用。您必须在命令行 运行 dart pub add collection 才能安装软件包。