我創建它包裝列表類:實現集合初始化在C#我的名單包裝
class Wrapper
{
private List<int> _list
}
我希望能夠初始化一個新的包裝對象是這樣的:
new Wrapper() {1, 2, 3};
這應該是初始化Wrapper的_list
到包含{1,2,3}的列表。
我需要添加到類代碼以啓用該功能?
我創建它包裝列表類:實現集合初始化在C#我的名單包裝
class Wrapper
{
private List<int> _list
}
我希望能夠初始化一個新的包裝對象是這樣的:
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();
}
「如果你想讓你的包裝更有效率地迭代,你可以改變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();
}
}
的http://計算器.com/questions/2495791/custom-collection-initializers –