如何区分 DART 中的复杂对象列表
How can I distinct a complex object list in DART
我有一个复杂对象列表。如何使用他们的 ID 区分列表?
我不能使用 toSet 和类似的东西,因为对象的哈希码都是不同的。
1) 香草飞镖
遍历列表,边走边向集合中添加 ID。每当您向集合中添加一个不存在的 ID 时,将该元素添加到一个新的不同值列表中。
void main() {
var list = [
Data('a'),
Data('a'),
Data('b'),
Data('c'),
];
var idSet = <String>{};
var distinct = <Data>[];
for (var d in list) {
if (idSet.add(d.id)) {
distinct.add(d);
}
}
}
class Data {
Data(this.id);
final String id;
}
2) 包
存在几个默认扩展 Iterable
实用方法的包,例如 flinq or darq。他们添加了一个 distinct
方法,您可以调用该方法以根据某些 属性 成员轻松获取列表中唯一成员的列表。
import 'package:darq/darq.dart';
void main() {
var list = [
Data('a'),
Data('a'),
Data('b'),
Data('c'),
];
var distinct = list.distinct((d) => d.id).toList();
}
(免责声明,我是 darq 的维护者。)
尝试使用此扩展程序:
extension IterableExtension<T> on Iterable<T> {
Iterable<T> distinctBy(Object getCompareValue(T e)) {
var result = <T>[];
this.forEach((element) {
if (!result.any((x) => getCompareValue(x) == getCompareValue(element)))
result.add(element);
});
return result;
}
}
使用:
var distinctList = someList.distinctBy((x) => x.oid);
或者您可以在那里使用哈希。
我有一个复杂对象列表。如何使用他们的 ID 区分列表?
我不能使用 toSet 和类似的东西,因为对象的哈希码都是不同的。
1) 香草飞镖
遍历列表,边走边向集合中添加 ID。每当您向集合中添加一个不存在的 ID 时,将该元素添加到一个新的不同值列表中。
void main() {
var list = [
Data('a'),
Data('a'),
Data('b'),
Data('c'),
];
var idSet = <String>{};
var distinct = <Data>[];
for (var d in list) {
if (idSet.add(d.id)) {
distinct.add(d);
}
}
}
class Data {
Data(this.id);
final String id;
}
2) 包
存在几个默认扩展 Iterable
实用方法的包,例如 flinq or darq。他们添加了一个 distinct
方法,您可以调用该方法以根据某些 属性 成员轻松获取列表中唯一成员的列表。
import 'package:darq/darq.dart';
void main() {
var list = [
Data('a'),
Data('a'),
Data('b'),
Data('c'),
];
var distinct = list.distinct((d) => d.id).toList();
}
(免责声明,我是 darq 的维护者。)
尝试使用此扩展程序:
extension IterableExtension<T> on Iterable<T> {
Iterable<T> distinctBy(Object getCompareValue(T e)) {
var result = <T>[];
this.forEach((element) {
if (!result.any((x) => getCompareValue(x) == getCompareValue(element)))
result.add(element);
});
return result;
}
}
使用:
var distinctList = someList.distinctBy((x) => x.oid);
或者您可以在那里使用哈希。