如何在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中删除重复项。 要明确:
- {‘A’,’A’} – {‘A’} == {‘A’}
- {‘A’,’A’} – {‘A’} == {}
我做第一个,Enumerable.Except做第二个。