[英]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();
}
}
對a
和b
任何更改將反映在A
和B
。
還要注意,雖然可以將List<T>
IReadOnlyList<T>
轉換為IReadOnlyList<T>
,但是調用代碼可以將其IReadOnlyList<T>
回List<T>
。 上面的方法返回一個ReadOnlyCollection<T>
,它提供了防止強制轉換回可變集合類型的保護措施。
readonly
關鍵字僅確保您以后不會將對a
和b
引用替換為其他內容。
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.