我正在编写一个将lambda表达式作为参数用于过滤IList<SomeModel> _collection
的方法。
public void DoSomething(SomeModel model)
{
FilterCollectionUsingPredicate(x => x.Name.Equals(model.Name));
}
private void FilterCollectionUsingPredicate(Func<SomeModel, bool> predicate)
{
_collection = _collection.Where(predicate).ToList();
}
predicate
参数是一个简单表达式,例如x => x.Name.Equals(model.Name)
时,效果很好。但是,当必须使用其他一些(本地)集合和Contains
子句时,它将变得很棘手。
public void DoSomething(SomeModel model)
{
IEnumerable<string> someOtherCollection = model.SomeOtherCollection;
FilterCollectionUsingPredicate(x => someOtherCollection.Contains(x.Phone));
}
private void FilterCollectionUsingPredicate(Func<SomeModel, bool> predicate)
{
_collection = _collection.Where(predicate).ToList();
}
当然,FilterCollectionUsingPredicate
方法看不到someOtherCollection
,因此会引发错误。有人可以解释如何正确定义和使用此功能来处理这种情况吗?
尝试创建通用扩展,而Expression应该跟踪表达式中的所有其他数据。尝试将谓词创建为Expression
private void FilterCollectionUsingPredicate(Expression<Func<SomeModel, bool>> predicate)
{
_collection = _collection.Where(predicate).ToList();
}
它应该起作用。