flutter 我有两个型号列表,我怎样才能得到它们之间的区别呢?

siv3szwd  于 2022-11-30  发布在  Flutter
关注(0)|答案(2)|浏览(117)
List a = [

AbsentModel(name: "abir", id: 1),
AbsentModel(name: "fahim", id: 2),
AbsentModel(name: "rahim", id: 3),
AbsentModel(name: "akash", id: 4), ]

List b = [
AbsentModel(name: "akash", id: 4),
AbsentModel(name: "fahim", id: 2),
AbsentModel(name: "rahim", id: 3),]

'我需要的输出-列表a和列表b之间的差
结果-

`List c = [ AbsentModel(name: "abir", id: 1),];

我试过toSet(),但它只能给我的结果,如果我做了所有的列表没有模型。就像如果做了简单的id列表,然后它的工作。但不能得到的差异,当我使用模型数据。

svujldwt

svujldwt1#

这段代码和其他代码一样可以正常工作。你只需要使用equatable包。

void main() {
  List a = [

AbsentModel(name: "abir", id: 1),
AbsentModel(name: "fahim", id: 2),
AbsentModel(name: "rahim", id: 3),
AbsentModel(name: "akash", id: 4), ]

List b = [
AbsentModel(name: "akash", id: 4),
AbsentModel(name: "fahim", id: 2),
AbsentModel(name: "rahim", id: 3),]

  List<AbsentModel> c = a.where((item) => !b.contains(item)).toList();
  print(c); 
}

但是,您需要重新定义AbsentModel,如下所示:

import 'package:equatable/equatable.dart';

class AbsentModel extends Equatable {
    final String name;
    final int id;

    AbsentModel({required this.name, required this.id,});

    @override
    List<Object> get props => [name, id];
}

Equatable为您覆盖了==hashCode,因此您不必浪费时间编写大量的样板代码。

cnjp1d6j

cnjp1d6j2#

第一个答案是正确的,但没有考虑到如果偏差值在列表b中,则不会被识别的事实。
这个解决方案类似于上面的解决方案,但是检查ab以及ba的差异。而且它是作为通用List的扩展编写的,所以它可以用于所有类型的列表。

extension Difference<T> on List<T> {
  List<T> difference(List<T> to) {
    final diff = where((item) => !to.contains(item)).toList();
    diff.addAll(to.where((item) => !contains(item)));
    return diff;
  }

main() {
...
  final diff = a.difference(b);
}

此外,您不必使用Equatable包(如果您不想这样做),因为您可能会重载==运算符:

class AbsentModel {
  final String name;
  final int id;

  AbsentModel({required this.name, required this.id});

  @override
  bool operator ==(Object other) {
    return (other is AbsentModel) && other.id == id && other.name == name;
  }
}

相关问题