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