如何在C#中对数组执行set减法?

给定C#中的两个数组,执行set减法的最简单方法是什么? 显然,这在Ruby中很容易实现。 基本上我只想删除数组b中的数组b中的元素:

 string[] a = new string[] { "one", "two", "three", "four" }; string[] b = new string[] { "two", "four", "six" }; string[] c = a - b; // not valid 

c应该等于{ "one", "three" }b - a会产生{ "six" }

如果你正在使用Linq,你可以像这样使用Except运算符 :

 string [] c = a.Except(b).ToArray(); 

编辑: CodeInChaos提出了一个很好的观点。 如果a包含重复项,它也将删除任何重复项。 使其function与Ruby版本完全相同的替代方法是:

 string [] c = a.Where(x=>!b.Contains(x)).ToArray(); 
 public static IEnumerable Minus(this IEnumerable enum1, IEnumerable enum2) { Dictionary elements = new Dictionary(); foreach (var el in enum2) { int num = 0; elements.TryGetValue(el, out num); elements[el] = num + 1; } foreach (var el in enum1) { int num = 0; if (elements.TryGetValue(el, out num) && num > 0) { elements[el] = num - 1; } else { yield return el; } } } 

这不会从enum1中删除重复项。 要明确:

  1. {‘A’,’A’} – {‘A’} == {‘A’}
  2. {‘A’,’A’} – {‘A’} == {}

我做第一个,Enumerable.Except做第二个。