我想根据其成员变量
的特定搜索条件从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
的对象。关于我可能做错什么的任何建议?
答案 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 ;
}