公开/传递要在私有列表上使用的LINQ表达式

时间:2009-03-09 05:19:50

标签: c# linq

我有一个私人列表,我希望公开查询列表并返回带有新克隆项目的新列表的功能。我可以传递代理进行过滤和排序,它工作正常,但能够使用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;
    }
}

2 个答案:

答案 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数据源一样对其进行查询。