リストをラップするクラスを作成しました:
class Wrapper
{
private List<int> _list
}
次のように新しい Wrapper オブジェクトを初期化できるようにしたいと思います。
new Wrapper() {1, 2, 3};
これは、Wrapper_list
を {1, 2, 3} を含むリストに初期化することになっています。
この機能を有効にするには、クラス コードに何を追加する必要がありますか?
リストをラップするクラスを作成しました:
class Wrapper
{
private List<int> _list
}
次のように新しい Wrapper オブジェクトを初期化できるようにしたいと思います。
new Wrapper() {1, 2, 3};
これは、Wrapper_list
を {1, 2, 3} を含むリストに初期化することになっています。
この機能を有効にするには、クラス コードに何を追加する必要がありますか?
次の 2 つが必要です。
IEnumerable
(ただし、コレクション初期化子自体のために、その動作は重要ではありません)。汎用バージョンを実装する必要はありませんが、通常は実装する必要があります。Add
要素の型をパラメーターとして受け入れるメソッドが必要です(int
この場合)。したがって、コンパイラはこれを次のように変換します。
Wrapper x = new Wrapper() {1, 2, 3};
これに:
Wrapper tmp = new Wrapper();
tmp.Add(1);
tmp.Add(2);
tmp.Add(3);
Wrapper wrapper = tmp;
最も簡単な方法は、ほぼ間違いなくリストに委任することです。
class Wrapper : IEnumerable<int>
{
private readonly List<int> _list = new List<int>();
public IEnumerator<int> GetEnumerator()
{
return _list.GetEnumerator();
}
// Explicit implementation of non-generic interface
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public void Add(int item)
{
_list.Add(item);
}
}
ラッパーの反復処理を少し効率的にしたい場合は、メソッドを変更して、以下を返すパブリック メソッドを含めることができます。GetEnumerator
List<T>.Enumerator
// Public method returning a mutable struct for efficiency
public List<T>.Enumerator GetEnumerator()
{
return _list.GetEnumerator();
}
// Explicit implementation of non-generic interface
IEnumerator<int> IEnumerable<int>.GetEnumerator()
{
return GetEnumerator();
}
// Explicit implementation of non-generic interface
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
class ListWrapper :IEnumerable<int>
{
private List<int> _list = new List<int>();
public void Add(int i)
{
_list.Add(i);
}
public IEnumerator<int> GetEnumerator()
{
return _list.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return _list.GetEnumerator();
}
}