带有字符串键的 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:collection
的 CanonicalizedMap
class 来执行此操作。此 class 明确设计用于支持具有 "canonical" 版本键的映射,并且比将自定义相等性和哈希码方法传递给普通 Map
.
稍微高效一些
Dart 有一个漂亮的地方
CaseInsensitiveEquality().equals(String a, String b)
在他们的
import 'package:collection/collection.dart';
它 returns 是一个布尔值,在我将字符串转换回枚举时对我非常有用。您必须在命令行 运行 dart pub add collection
才能安装软件包。
如果键是字符串,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
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:collection
的 CanonicalizedMap
class 来执行此操作。此 class 明确设计用于支持具有 "canonical" 版本键的映射,并且比将自定义相等性和哈希码方法传递给普通 Map
.
Dart 有一个漂亮的地方
CaseInsensitiveEquality().equals(String a, String b)
在他们的
import 'package:collection/collection.dart';
它 returns 是一个布尔值,在我将字符串转换回枚举时对我非常有用。您必须在命令行 运行 dart pub add collection
才能安装软件包。