C# 6.0 - Extension Add methods in collection initializers

C# 6.0 以前,集合類別可以像下面這樣透過 Collection Initializers 初始集合成員:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
...
var blogs = new List< Blog>
{
new Blog( "Level Up 1", "http://www.dotblogs.com.tw/larrynung" ),
new Blog( "Level Up 2", "http://larrynung.github.io" )
};
...
{% endcodeblock%}

<br/>


但無法像 VB 10 以後的版本一樣透過擴充方法客製處理 Collection Initializers 的動作,一直到 C# 6.0 才被加入 C# 內。

<br/>


只要為集合撰寫 Add 擴充方法即可客製處理 Collection Initializers,像是如果預期要讓 List<Blog> 的初始可以直接帶入 name 與 url,就會像下面這樣撰寫:

```c#
...
public static class BlogExtension
{
public static void Add(this List<Blog> list, string name, string url)
{
list.Add( new Blog(name, url));
}
}
...


集合成員的初始就可以像下面這樣撰寫:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
...
blogs = new List< Blog>
{
{ "Level Up 1", "http://www.dotblogs.com.tw/larrynung" },
{ "Level Up 2", "http://larrynung.github.io" }
};
...
{% endcodeblock%}


最後附上完整的測試範例:

```c#
using System;
using System.Collections.Generic;


public class Program
{
static void Main(string[] args)
{
var blogs = new List< Blog>
{
new Blog( "Level Up 1", "http://www.dotblogs.com.tw/larrynung" ),
new Blog( "Level Up 2", "http://larrynung.github.io" )
};


DumpBlogs(blogs);


blogs = new List< Blog>
{
{ "Level Up 1", "http://www.dotblogs.com.tw/larrynung" },
{ "Level Up 2", "http://larrynung.github.io" }
};


DumpBlogs(blogs);
}


private static void DumpBlogs( List< Blog> blogs)
{
foreach ( var blog in blogs)
Console.WriteLine( string.Format( "{0} ({1})", blog.Name, blog.Url));
}
}
public class Blog
{
public string Name { get; set; }
public string Url { get; set; }
public Blog(string name, string url)
{
this.Name = name;
this.Url = url;
}
}


public static class BlogExtension
{
public static void Add(this List<Blog> list, string name, string url)
{
list.Add( new Blog(name, url));
}
}


運行結果如下: