如果密钥是字符串,Dart中的Map类是否有办法忽略大小写?
例如
var map = new Map<String, int>(/*MyComparerThatIgnoresCase*/);
map["MyKey"] = 42;
var shouldBe42 = map["mykey"];
在C#中,Dictionary构造函数采用上述注释之类的比较器。在Dart中执行此操作的规范方法是什么?
答案 0 :(得分:6)
Dart中的地图有一个内部方法,用于比较相等的键。据我所知,您无法为默认的Map
课程更改此内容。但是,您可以使用非常相似的核心LinkedHashMap
类,它不仅允许,而且还要求您指定密钥相等方法。您可以在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
答案 1 :(得分:5)
使用自定义equals函数(以及相应的自定义hashCode函数)创建HashMap
的方法是使用HashMap
构造函数上的可选参数:
new HashMap<String,Whatever>(equals: (a, b) => a.toUpperCase() == b.toUpperCase(),
hashCode: (a) => a.toUpperCase().hashCode);
我真的,真的建议找到一种方法,不要在每次操作时都使用toUpperCase!
答案 2 :(得分:2)
您也可以使用package:collection
的{{3}}课程来完成此操作。此类明确设计为支持具有“规范”版本的键的映射,并且比将自定义相等和哈希代码方法传递给普通Map
稍微有效。
答案 3 :(得分:0)
您可以使用Dictionary
但这不是Dart中这样做的规范方法。
import "package:queries/collections.dart";
void main() {
var dict = new Dictionary<String, int>(new IgnoreCaseComparer());
dict["MyKey"] = 42;
var shouldBe42 = dict["mykey"];
print(shouldBe42);
}
class IgnoreCaseComparer implements IEqualityComparer {
bool equals(Object a, Object b) {
if (a is String && b is String) {
return a.toLowerCase() == b.toLowerCase();
}
return a == b;
}
int getHashCode(Object object) {
if (object is String) {
return object.toLowerCase().hashCode;
}
return object.hashCode;
}
}
<强>输出强>
42