如何区分 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);

或者您可以在那里使用哈希。