簡體   English   中英

c#為同一類實現兩個枚舉器

[英]c# Implementing two enumerators for the same class

好的,這是基本代碼:

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接口,然后將THOSE包含為屬性? 我是否誤解了IEnumerable接口? 我知道List類有它自己的Enumerator,所以我可以做類似的事情

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界面,所以也許我缺少明顯的東西。

不要公開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>轉換為IReadOnlyList<T> ,但是調用代碼可以將其IReadOnlyList<T>List<T> 上面的方法返回一個ReadOnlyCollection<T> ,它提供了防止強制轉換回可變集合類型的保護措施。

readonly關鍵字僅確保您以后不會將對ab引用替換為其他內容。

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();}}

}

這樣,您甚至不必初始化它,也不需要任何設置

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM