dart - forEach 没有预期的过滤
问题描述
所以我试图过滤一个包含一些对象的普通列表。在这些对象中是一个 ID,应该只显示一次。我的问题是这不起作用。当我尝试只输出单个 ID 时,它可以工作:
List container = [];
haltepunkte.forEach((element) {
if (!container.contains(element["LineID"])) {
print(element['LineID']);
container.add(element);
}
});
当我在容器上调用 print 时,这会再次输出我的整个列表。
[{StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 136}, {StopID: 130, StopText: Seegasse, LineID: 136}, {StopID: 130, StopText: Seegasse, LineID: 136}]
但是现在,我只需将“LineID”添加到列表中并返回 ID,现在它就可以工作了:
List container = [];
haltepunkte.forEach((element) {
if (!container.contains(element["LineID"])) {
print(element['LineID']);
container.add(element['LineID']);
}
});
[101, 136, 538, 611]
有谁知道为什么会这样?我的目标是取回一个列表,其中每个 LineID 只存在一次。
解决方案
原因是你的if
说法:
if (!container.contains(element["LineID"])) {
您正在检查列表是否已经包含相同的LineID
值。但是,如果您将整个元素放入列表中,例如container.add(element);
列表不再包含值,element["LineID"]
而是整个Map
元素。
该contains
方法不检查是否可以在Map
列表中的对象内找到值。它只检查它是否可以找到属于==
另一个对象的任何对象。
更新
一种解决方案是使用 aMap
来保存 LineID 和元素之间的关系,并使用它来检查您是否已经拥有该元素。然后您可以通过获取地图的值来提取所有元素:
void main() {
final containerMap = <String, Map>{};
final haltepunkte = [
{'LineID': 5, 'txt': 'test'},
{'LineID': 6, 'txt': 'more tests'}
];
haltepunkte.forEach((element) {
if (!containerMap.containsKey(element["LineID"])) {
print(element['LineID']);
containerMap[element["LineID"]] = element;
}
});
final container = [...containerMap.values];
}
推荐阅读
- unit-testing - 使用 PowerMockito 模拟私有 void 方法
- laravel - 无法从 laravel 队列中的数据库中删除记录
- kubernetes - 基于印花布的吊舱没有出现
- python - TensorFlow 2 中 tf.contrib.seq2seq.prepare_attention 的等价性是什么
- wordpress - 我需要在主页上显示来自几个自定义帖子类型的 1 个帖子摘录,无论我做什么,我都会得到所有这些而不是 1
- python - 在python中将月-年格式更改为年-月-日格式
- javascript - 在javascript中删除重复的数组数组
- python - 如何从索引 100 到末尾用零完成?
- r - R中的表面栅格图
- java - 具有超类构造函数调用的 Kotlin 类的 Java 等效项