我创建了一个包装List的类:
class Wrapper
{
private List<int> _list
}
我希望能够像这样初始化一个新的Wrapper对象:
new Wrapper() {1, 2, 3};
应该将Wrapper的_list
初始化为包含{1,2,3}的列表。
为了启用这项功能,我需要添加什么类?
答案 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();
}
}