代码之家  ›  专栏  ›  技术社区  ›  Rajeshwar

使用“where”搜索DART中特定对象的对象列表

  •  1
  • Rajeshwar  · 技术社区  · 8 年前

    我想从基于其成员变量的特定搜索条件的列表中获取一个对象

    这是我正在使用的代码

    class foo
    {
      foo(this._a);
      int _a;
    }
    
    List<foo> lst = new List<foo>();
    
    main()
    {
      foo f = new foo(12);
    
      lst.add(f);
      List<foo> result = lst.where( (foo m) {
        return m._a == 12;
      });
    
      print(result[0]._a);
    }
    

    我得到了错误,不知道如何解决这个问题

    意外异常:

    TypeError: Instance of 'WhereIterable<foo>': type 'WhereIterable<foo>' is not a subtype of type 'List<foo>'
    

    我正试图搜索一个其成员变量为 a == 12 . 对我可能做错什么有什么建议吗?

    2 回复  |  直到 8 年前
        1
  •  5
  •   lrn    8 年前

    这个 Iterable.where 方法返回的iterable 全部的 满足您的测试的成员,而不仅仅是一个,而且它是一个懒散计算的iterable,而不是一个列表。你可以使用 lst.where(test).toList() 创建一个列表,但如果只需要第一个元素,那就太过分了。

    你可以使用 lst.firstWhere(test) 而是只返回第一个元素,或者可以使用 lst.where(test).first 有效地做同样的事情。 在这两种情况下,如果没有与测试匹配的元素,则代码将抛出。

    为了避免投掷,你可以使用 var result = lst.firstWhere(test, orElse: () => null) 所以你得到 null 如果没有这样的元素。

    另一种选择是

    foo result;
    int index = lst.indexWhere(test); 
    if (index >= 0) result = lst[index];
    
        2
  •  2
  •   Tobe Osakwe    8 年前

    答案很简单。 Iterable.where 返回一个 Iterable 不是 List . 恐怕这是因为 _WhereIterable 懒惰地计算。

    如果你 真的? 需要返回列表,打电话 lst.where(...).toList() .

    否则,您可以设置 result 成为一个 Iterable<foo> ,而不是 List<foo> .