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

  • 本文关键字:集合 实现 包装 List c#
  • 更新时间 :
  • 英文 :


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

class Wrapper
{
    private List<int> _list
}

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

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

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

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

你需要

两样东西:

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

最新更新