我有一个私人列表,我希望公开查询列表并返回带有新克隆项目的新列表的功能。我可以传递代理进行过滤和排序,它工作正常,但能够使用Linq表达式会更优雅。
我添加了一个简单的例子,说明我正在尝试做什么,这可能会有所帮助,因为我认为我没有解释我想做的事情。
public class Repository
{
private List<SomeModel> _models;
private object _lock;
public List<SomeModel> GetModels(Func<SomeModel, bool> predicate)
{
List<SomeModel> models;
lock (_lock)
{
models = _models.Where(m => predicate(m))
.Select(m => new SomeModel(m))
.ToList();
}
return models;
}
}
答案 0 :(得分:3)
为什么您的代码涉及锁定?假设您的“SomeModel”类有一个复制构造函数,如您的示例所示,这应该可以工作:
public List<SomeModel> GetModels(Predicate<SomeModel> predicate)
{
return _models.Where(m => predicate(m))
.Select(m => new SomeModel(m))
.ToList();
}
答案 1 :(得分:1)
您可以通过执行以下操作将私有集合公开为迭代器块:
public IEnumerable<Model> Models
{
get
{
foreach (Model mod in this._models)
yield return new Model(mod);
// equivalent to:
// return _models.Select(m => new Model(m));
// as per Jon's comment
}
}
这将使您能够像任何其他IEnumerable数据源一样对其进行查询。