C# 3.0 集合運算 (交集、差集、聯集、互斥) - Value Type

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