【问题标题】:Dart compare unordered Lists with ObjectsDart 比较无序列表和对象
【发布时间】:2020-03-05 13:38:10
【问题描述】:

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

我也尝试过 DeepCollectionEquality.unordered().equals 从这个问题: How can I compare Lists for equality in Dart?

但它也给了我 FALSE。 在我的真实项目中,我有两个包含文章的列表。这些列表没有排序,因此一篇文章可以是一个列表中的第一个,而具有相同 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));

【问题讨论】:

    标签: list flutter dart compare


    【解决方案1】:

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

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

    那么结果就是真的,因为id是一样的。

    你也可以看看这个包

    https://pub.dev/packages/equatable

    【讨论】:

    • 谢谢,我将使用“equatable”包。舒服多了:)
    【解决方案2】:

    作为我的解决方案,我使用了 "equatable"- 包: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];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 2015-04-02
      • 2022-06-26
      • 2019-01-03
      • 2013-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多