4

リストをラップするクラスを作成しました:

class Wrapper
{
    private List<int> _list
}

次のように新しい Wrapper オブジェクトを初期化できるようにしたいと思います。

new Wrapper() {1, 2, 3};

これは、Wrapper_listを {1, 2, 3} を含むリストに初期化することになっています。

この機能を有効にするには、クラス コードに何を追加する必要がありますか?

4

2 に答える 2

5

次の 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);
    }
}

ラッパーの反復処理を少し効率的にしたい場合は、メソッドを変更して、以下を返すパブリック メソッドを含めることができます。GetEnumeratorList<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();
}
于 2012-12-11T07:34:58.807 に答える
2
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();
    }
}
于 2012-12-11T07:37:12.337 に答える