2013-05-18 55 views
1
時順利

考慮我下面的類專輯:的IEnumerable <>而不是List <>閱讀對象

public class Album 
{ 
    public int? Id { get; set; } 
    public string Name { get; set; } 
    public IEnumerable<Photo> Photos { get; set; } 
    public DateTime Registered { get; set; } 
} 

我沒有煩惱了檢索數據和填充我的專輯和我的照片集。

但是現在我也想'添加'一個照片項目到我的照片集合中,'添加'不被識別爲照片上的有效方法。

「System.Collections.Generic.IEnumerable'does不含 定義‘添加’和沒有擴展方法‘添加’接受型的第一 參數....

什麼我應該做一個簡單的事情來讓它與IEnumerable一起工作嗎?我不想改變我的財產

public List<Photo> Photos { get; set;} 

我真的需要在我的相冊類上實現ICollection嗎?

public class Album : ICollection<Photo> { ... } 
+1

是否有原因,你不只是使用'列表'? –

回答

1

嘗試使照片成爲私人列表,然後創建一個標準的屬性,將其作爲IEnumerable公開。然後添加一個「AddPhoto」方法到您的相冊對象。

這樣,您可以讓專輯控制如何將項目添加到其內部集合中。

public class Album 
{ 
    private List<Photo> _photos = new List<Photo>(); 

    public IEnumerable<Photo> Photos { get { return _photos; } } 

    public void AddPhoto(Photo photo) 
    { 
     _photos.Add(photo); 
    } 
} 

*編輯這是對dasblinkenlight的一個類似的答案,只是更富有代表性的代碼。現在我將把它留在這裏,因爲它增加了一點澄清。

+0

這就是我需要的:) – codingjoe

5

如果你不想屬性類型更改爲允許添加(IList<Photo>ICollection<Photo>)添加一個單獨的方法添加圖片,就像這樣:

public void AddPhoto(Photo p) { 
    ... 
} 

這將讓你保持IEnumerable<Photo>作爲您的財產的類型,並且還允許驗證調用者所放入的內容。例如,您的代碼將能夠檢測照片是否太大或太小,以及是否引發異常。如果你暴露了IList<Photo>,這將會困難得多,因爲你需要提供你自己的實現來覆蓋Add

您還應該使您的汽車屬性的設置器保持私密,或者用getter +後臺字段替換auto屬性。

+2

並取代自動屬性有一個後盾... – Oded

+0

+1 deffo的路要走。可能需要移除「Photos」屬性的setter。 –

+0

我讀過使用IEnumerable會讓我的LINQ執行速度更快。如果我使用另一個集合界面,會改變嗎? – codingjoe

0

IEnumerable<T>不允許在枚舉過程中更改序列。沒有其他方式,只能使用其他接口,例如ICollection<T>IList<T>

這樣的Photos看起來像

public IList<Photo> Photos { get; set;} 
// or 
public ICollection<Photo> Photos { get; set;} 

當然你也可以使用實際的類和接口不,但通常接口,給你更多的自由。

+0

我讀過使用IEnumerable會讓我的LINQ執行速度更快。如果我使用另一個集合界面,會改變嗎? – codingjoe

0

嘗試:

myAlbum.Photos = myAlbum.Photos.Concat(newPhoto); 

你需要在你的文件的頂部添加using System.Linq;

相關問題