Dart сравнивает неупорядоченные списки с объектами - PullRequest
2 голосов
/ 09 ноября 2019

У меня следующая проблема. Есть два списка со статьями в нем. В следующем примере результат выводит меня false . Но статьи одинаковы. Я думаю, это потому, что это разные объекты, если я добавлю в оба списка article1, это будет true .

Я также попробовал DeepCollectionEquality.unordered (). Equals из этой проблемы: Как я могу сравнить списки на равенство в дротике?

Но это также возвращает мне FALSE,В моем реальном проекте у меня есть два списка со статьями. Эти списки не отсортированы, поэтому одна статья может быть первой в одном списке, а статья с таким же идентификатором и именем может быть последней в другом списке. Но если оба списка имеют одинаковые статьи (с одинаковым именем и идентификатором), это должно привести к значению 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));

Ответы [ 3 ]

3 голосов
/ 09 ноября 2019

Как вы сказали, это разные объекты, вам нужно переопределить оператор равенства вашего класса, например:

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;
}

Тогда результат будет истинным, потому что идентификаторы одинаковы.

Также вы можете посмотреть на этот пакет

https://pub.dev/packages/equatable

1 голос
/ 09 ноября 2019

В случае, когда невозможно (или нежелательно) изменить сравниваемые объекты, вы можете использовать этот метод.

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;
  }
}
0 голосов
/ 09 ноября 2019

В качестве решения я использовал пакет "equatable": https://pub.dev/packages/equatable

Для проверки неупорядоченного списка я использую DeepCollectionEquality.unordered (). Равно вместо 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...