【发布时间】:2020-07-30 02:12:54
【问题描述】:
我正在编写一个获取 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,因此会引发错误。
有人能解释一下如何正确定义和使用这个函数来处理这种情况吗?
【问题讨论】:
-
抛出什么错误?仅供参考
someOtherCollection将作为粘贴的 lambda 的一部分被捕获。 -
我认为
predicate必须是Expression而不是Fun。 -
您将不得不添加更多细节,因为我试图重现这一点并且它工作得很好。至少我们需要知道错误。
-
@Sajid 我对此表示怀疑,因为在分配给
_collection时使用ToList表示我们没有处理IQueryable。但是_collection可能是一个IEnumerable,OP 首先分配一个IQueryable。这只是 OP 提供更多细节的另一个原因。 -
@juharr:你是对的,问题中的解决方案,它工作正常。没有错误。
标签: c# linq lambda contains func