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

时间:2018-06-16 23:46:57

标签: dart

我想根据其成员变量

的特定搜索条件从List中获取对象

这是我正在使用的代码

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的对象。关于我可能做错什么的任何建议?

3 个答案:

答案 0 :(得分:5)

Iterable.where方法返回所有成员的迭代,这些成员满足您的测试,而不仅仅是一个,并且它是一个懒惰的计算可迭代,而不是列表。您可以使用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];

答案 1 :(得分:2)

答案很简单。 Iterable.where会返回Iterable,而非List。 AFAIK这是因为_WhereIterable懒惰地进行计算。

如果确实需要返回一个列表,请致电lst.where(...).toList()

否则,您可以将result设置为Iterable<foo>,而不是List<foo>

答案 2 :(得分:0)

否则您可以发疯并执行此操作:

bool checkIfProductNotFound(Map<String, Object> trendingProduct) {
bool isNotFound = this
    ._MyProductList
    .where((element) => element["id"] == trendingProduct["id"])
    .toList()
    .isEmpty;

return isNotFound ;
}