2016-01-27 25 views
0

我有一個包裝對象列表的類。我希望這個類與foreach循環兼容。讓一個類兼容foreach

我看到過幾個關於如何在SO上做的問題,但大多數答案都不能爲我編譯。

class TrackList 
{ 
    private List<Track> tracks = new List<Track>(); 
} 

你會添加什麼來使它適用於每個?

到目前爲止,我有:

class TrackList : IEnumerable<Track> 
{ 
    // ... 

    public IEnumerator<Track> GetEnumerator() 
    { 
     return trackList.GetEnumerator(); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerator.GetEnumerator() 
    { 
     return this.GetEnumerator(); 
    } 
} 

但它說(翻譯錯誤):

錯誤1 'HP.TrackList' 未實現接口成員 「System.Collections.IEnumerable .GetEnumerator()」。 'HP.TrackList.GetEnumerator()'無法實現 'System.Collections.IEnumerable.GetEnumerator()',因爲它不具有對應於 'System.Collections.IEnumerator'的返回類型。 XXX \ TrackList.cs 11

相反,如果我使用:

IEnumerator<Track> IEnumerator<Track>.GetEnumerator() 
{ 
    return this.GetEnumerator(); 
} 

是給我同樣的錯誤。

+0

爲什麼你需要迭代類,而不是類的屬性? – krillgar

+0

由於其他原因,我不想讓軌道作爲一個屬性可用。您可以迭代列表而不訪問該列表的屬性,例如名爲Items的屬性。我想迭代我的曲目列表而不訪問屬性類(例如)曲目。 – Virus721

+2

請改用'System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()'。 –

回答

6

此行是錯誤的:

System.Collections.IEnumerator System.Collections.IEnumerator.GetEnumerator() 

你這裏有兩種類型:

System.Collections.IEnumerator System.Collections.IEnumerator.GetEnumerator() 
^----------------------------^ ^----------------------------^ 
    The type you're returning  The interface you're 
             implementing 

第二個應該是IEnumerableIEnumerator所以使它:

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 

還要注意,您的私人領域:

private List<Track> tracks = new List<Track>(); 

被命名爲tracks而不是trackList,我假設這是一個簡單的錯字,否則您需要修復此錯誤。

+0

感謝您的回答。因爲曲目列表本身就是對象,所以我認爲它更有意義。trackList是我爲這個類的實例使用的。 – Virus721