IEnumerable <>而不是List <>在读取对象时运行良好

cod*_*joe 1 .net c# ienumerable

考虑我的以下课堂专辑:

public class Album
{
    public int? Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<Photo> Photos { get; set; }
    public DateTime Registered { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我没有麻烦检索数据并填充我的相册和我的照片集.

但是现在我还想在照片集中"添加"照片项目,"添加"不被视为照片上的有效方法.

'System.Collections.Generic.IEnumerable'不包含'Add'的定义,也没有扩展方法'Add'接受类型的第一个参数....

我应该怎么做才能让它与IEnumerable一起工作?我不想改变我的财产

public List<Photo> Photos { get; set;}
Run Code Online (Sandbox Code Playgroud)

我真的需要在我的Album类上实现ICollection吗?

 public class Album : ICollection<Photo> { ... }
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

如果您不想将属性类型更改为允许添加的内容(IList<Photo>ICollection<Photo>)添加单独的方法来添加图片,如下所示:

public void AddPhoto(Photo p) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

这可以让您保留IEnumerable<Photo>属性的类型,并允许验证调用者输入的内容.例如,您的代码将能够检测照片是否太大或太小,并抛出异常.如果你暴露IList<Photo>,这将是很难做到的,因为你需要提供自己的覆盖实现Add.

您还应该将auto属性的setter设为private,或者使用getter + backing字段替换auto属性.

  • @codingjoe IEnumerable与让你的Linq表现更快无关.重要的是底层集合类型(因为Linq对某些类型执行了一些优化,例如`List <T>`).如果你将底层类型更改为`List <T>`,它可能会更快*. (2认同)