2015-06-07 63 views
0

好了,所以這裏的基本代碼:C#爲同一類實現兩個枚舉

class foo 
{ 
    String name; 
    int property; 
} 

class bar 
{ 
    private List<foo> a; 
    private List<foo> b; 
} 

我想打它,以便調用代碼可以通過遍歷任一列表中,但我想,讓他們免受編輯。我研究過實現IEnumarable接口,但問題是它期望有一個「GetEnumerable」定義,但我需要兩個不同的枚舉器。舉例來說,我希望能夠說

foreach(foo in bar.getA()) 
{ //do stuff } 

然後

foreach(foo in bar.getB()) 
{ //do stuff } 

我一定要繼承的每個元素和落實在每個IEnumerable接口,然後包括那些作爲屬性?我誤解了IEnumerable接口?我知道,表類有它自己的調查員,所以我可以做類似

class bar 
{ 
    private List<foo> a; 
    private List<foo> b; 

    public IEnumerator<foo> getAEnumerator() 
    { return a.GetEnumerator(); 

    public IEnumerator<foo> getBEnumerator() 
    { return b.GetEnumerator(); 

} 

但後來我的for循環看起來像這樣:

bar x = new bar(); 
IEnumerator<foo> y = x.getAEnumerator(); 
while (y.moveNext()) 
{ 
    foo z = y.Current; 
} 

,所以我失去了「的foreach」可讀性。

有沒有一種方法可以完成對這些列表使用「foreach」而不公開公開這些列表?我仍然試圖讓我的頭在IENumerable接口,所以也許我錯過了明顯的東西。

+0

見http://stackoverflow.com/questions/590991/merging-two-ienumerablets – haim770

回答

2

請勿將List<T>,揭露別的東西,像一個IReadOnlyList<T>代替:

class bar 
{ 
    private readonly List<foo> a = new List<foo>(); 
    private readonly List<foo> b = new List<foo>(); 

    public IReadOnlyList<foo> A { get; private set; } 
    public IReadOnlyList<foo> B { get; private set; } 

    public bar() 
    { 
     A = a.AsReadOnly(); 
     B = b.AsReadOnly(); 
    } 
} 

ab的任何更改將在AB反映。

另請注意,儘管您可以將List<T>轉換爲IReadOnlyList<T>,但調用代碼可以將其轉換回List<T>。上面的方法返回一個ReadOnlyCollection<T>,它提供了一個防止轉換回可變集合類型的安全措施。

readonly關鍵字只確保您不會用以後的其他內容替換對ab的引用。

+0

沒錯;正是我正在尋找的東西。直到現在,我還沒有意識到我對列表的瞭解有多少。時間一些閱讀。 – zeusalmighty

+0

@zeusalmighty在這種情況下,您可能對我的[集合語義](http://stackoverflow.com/q/26202036/3764814)的答案感興趣,它提供了框架中可用的集合類的幾個示例。 –

0
class bar 
{ 
    private readonly List<foo> a = new List<foo>(); 
    private readonly List<foo> b = new List<foo>(); 

    public IReadOnlyList<foo> A { get {return a.AsReadOnly();}} 
    public IReadOnlyList<foo> B { get {return b.AsReadOnly();}} 

} 

這樣你甚至不需要初始化,並且無需任何一套