C# 3.0 集合運算 (交集、差集、聯集、互斥) - Value Type
C# 2.0 的時候,如果針對一些實值型別 (value type) 作集合運算,我會使用 unicorn.net 所介紹【想在 .Net 裡頭用 Set Collection (使用 Iesi.Collections.dll)】文章作法。到了 C# 3.0,不用另外引用第三方 dll 檔案,也可以做輕輕鬆鬆作集合的運算囉,以下參考上述文章的範例以 string 陣列作為練習:
1: var Girls = new[] {"Christine", "Eva", "Jean", "Novia", "Winnie"};
2: var PMs = new[] {"Eva", "Novia", "Vincent", "Williams", "Winnie"};
3:
4: // 是 Girl 且是 PM (交集)
5: foreach (var s in Girls.Intersect(PMs))
6: {
7: Console.WriteLine(s);
8: }
9: Console.WriteLine();
10:
11: // 是 Girl 且不是 PM (差集)
12: foreach (var s in Girls.Except(PMs))
13: {
14: Console.WriteLine(s);
15: }
16: Console.WriteLine();
17:
18: // 是 Girl 或是 PM (聯集)
19: foreach (var s in Girls.Union(PMs))
20: {
21: Console.WriteLine(s);
22: }
23: Console.WriteLine();
24:
25: // 是 Girl 但不是 PM,或是 PM 但不是 Girl (互斥)
26: foreach (var s in (Girls.Except(PMs)).Union(PMs.Except(Girls)) )
27: {
28: Console.WriteLine(s);
29: }
30: Console.WriteLine();
PS. 雖然是以 string 陣列來當作範例,但是集合是不允許重複元素的,如果要剔除重複元素可使用 C# 3.0 的 .Distinct 方法。
如果是做交集可使用 .Intersect 方法、差集可使用 .Except 方法、聯集使用 .Union 方法;如果是互斥 (exclusive or) 的話,似乎 C# 3.0 沒有提供快速的方法,只能夠將兩個集合互相交集後再聯集求解了。
以下為輸出結果:
1: // 是 Girl 且是 PM (交集)
2: Eva
3: Novia
4: Winnie
5:
6: // 是 Girl 且不是 PM (差集)
7: Christine
8: Jean
9:
10: // 是 Girl 或是 PM (聯集)
11: Christine
12: Eva
13: Jean
14: Novia
15: Winnie
16: Vincent
17: Williams
18:
19: // 是 Girl 但不是 PM,或是 PM 但不是 Girl (互斥)
20: Christine
21: Jean
22: Vincent
23: Williams