2012-12-11 74 views
4

我創建它包裝列表類:實現集合初始化在C#我的名單包裝

class Wrapper 
{ 
    private List<int> _list 
} 

我希望能夠初始化一個新的包裝對象是這樣的:

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

這應該是初始化Wrapper的_list到包含{1,2,3}的列表。

我需要添加到類代碼以啓用該功能?

+0

的http://計算器.com/questions/2495791/custom-collection-initializers –

回答

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(); 
} 
+0

「如果你想讓你的包裝更有效率地迭代,你可以改變GetEnumerator方法來包含一個返回列表.Enumerator:」 - 或者,定義一個自定義的本地'struct Enumerator',它包含一個類型爲'List .Enumerator'的單個字段,幷包裝它的方法。它的行爲相同,但IMO對於調用者更有意義,如果調用者有一個理由來命名枚舉類型(正如你在這裏爲'List '所做的那樣)。 – hvd

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(); 
    } 
}