Dart将无序列表与对象进行比较

我有以下问题。有两个带有文章的列表。在以下示例中,结果将显示 false 。但是条款是一样的。我认为那是因为这些是不同的对象,所以如果我在两个列表中都添加article1,它将为 true

我还尝试过此问题的DeepCollectionEquality.unordered()。equals: How can I compare Lists for equality in Dart?

但这也让我回到了假。 在我的真实项目中,我有两个带有文章的列表。这些列表未排序,因此一个Article可以是一个列表中的第一条,而具有相同ID和名称的文章可以是另一个列表中的最后一个。但是,如果两个列表具有相同的文章(具有相同的名称和ID),则结果应为true。

var a = List<Article>();
var b = List<Article>();

var article1 = Article(id: "1",name: "Beer");
var article2 = Article(id: "1",name: "Beer");

a.add(article1);
b.add(article2);

print(listEquals(a,b));
yjyhp5211314 回答:Dart将无序列表与对象进行比较

正如您所说,这些是不同的对象,您需要重写类的等号运算符,如下所示:

class Article {
  final String name;
  final String id;
  const Article({this.id,this.name});

  @override
  bool operator ==(Object other) =>
    identical(this,other) ||
    other is Article &&
    runtimeType == other.runtimeType &&
    id == other.id;

  @override
  int get hashCode => id.hashCode;
}

然后结果将为true,因为id相同。

您还可以查看此软件包

https://pub.dev/packages/equatable

,

在无法(或不希望)修改比较对象的情况下,可以使用此方法。

import 'package:enumerable/enumerable.dart';

void main(List<String> args) {
  var a = List<Article>();
  var b = List<Article>();

  var article1 = Article(id: "1",name: "Beer");
  var article2 = Article(id: "1",name: "Beer");

  a.add(article1);
  b.add(article2);

  print(a.sequenceEqual(b,ArticleEqualityComparer()));
}

class Article {
  String id;
  String name;
  Article({this.id,this.name});
}

class ArticleEqualityComparer implements IEqualityComparer<Article> {
  @override
  bool equals(Article a,Article b) {
    if (identical(a,b)) {
      return true;
    }

    if (a == null || b == null) {
      return false;
    }

    return a.id == b.id && a.name == b.name;
  }

  @override
  int getHashCode(Article object) {
    if (object == null) {
      return null.hashCode;
    }

    return object.id.hashCode ^ object.name.hashCode;
  }
}
,

作为解决方案,我使用了“等于”包装:https://pub.dev/packages/equatable

要检查无序列表,我使用 DeepCollectionEquality.unordered()。equals 而不是 listEquals

var a = List<Article>();
var b = List<Article>();

var article1 = Article(id: "1",name: "Beer");
var article2 = Article(id: "2",name: "Tequilla");
var article3 = Article(id: "3",name: "VodkaBull");
var article4 = Article(id: "1",name: "Beer");
var article5 = Article(id: "2",name: "Tequilla");
var article6 = Article(id: "3",name: "VodkaBull");

a.add(article1);
a.add(article2);
a.add(article3);
b.add(article4);
b.add(article5);
b.add(article6);

print(listEquals(a,b));
print(DeepCollectionEquality.unordered().equals(a,b));

“我的文章”的代码如下:

import 'package:equatable/equatable.dart';

class Article extends Equatable {
  String id;
  String name;

  Article({this.id,this.name});

  @override
  // TODO: implement props
  List<Object> get props => [id,name];
}
本文链接:https://www.f2er.com/3134717.html

大家都在问