使用String键进行Dart Map,与ignore case进行比较

时间:2015-01-03 12:00:55

标签: dart

如果密钥是字符串,Dart中的Map类是否有办法忽略大小写?

例如

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

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

4 个答案:

答案 0 :(得分:6)

Dart中的地图有一个内部方法,用于比较相等的键。据我所知,您无法为默认的Map课程更改此内容。但是,您可以使用非常相似的核心LinkedHashMap类,它不仅允许,而且还要求您指定密钥相等方法。您可以在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

答案 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