在C#中为我的List包装器实现一个集合初始值设定项

时间:2012-12-11 07:33:04

标签: c#

我创建了一个包装List的类:

class Wrapper
{
    private List<int> _list
}

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

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

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

为了启用这项功能,我需要添加什么类?

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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();
    }
}