4

我创建了一个包装列表的类:

class Wrapper
{
    private List<int> _list
}

我希望能够像这样初始化一个新的 Wrapper 对象:

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

这应该将 Wrapper 初始化为_list包含 {1, 2, 3} 的列表。

为了启用该功能,我需要向类代码添加什么?

4

2 回答 2

5

你需要两件事:

  • 您需要实现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();
}
于 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 回答