我创建了一个包装列表的类:
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} 的列表。
为了启用该功能,我需要向类代码添加什么?
你需要两件事:
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();
}
}