在C#中给定两个数组的情况下,执行set减法的最简单方法是什么?显然,这是Ruby中的dead easy。基本上我只想删除数组a
中数组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" }
。
答案 0 :(得分:31)
如果你正在使用Linq,你可以像这样使用Except operator:
string [] c = a.Except(b).ToArray();
编辑:CodeInChaos提出了一个很好的观点。如果a
包含重复项,则它也会删除所有重复项。使其功能与Ruby版本完全相同的替代方法是:
string [] c = a.Where(x=>!b.Contains(x)).ToArray();
答案 1 :(得分:3)
public static IEnumerable<T> Minus<T>(this IEnumerable<T> enum1, IEnumerable<T> enum2)
{
Dictionary<T, int> elements = new Dictionary<T, int>();
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中删除重复项。要明确:
我做第一个,Enumerable.Except做第二个。