18

给定 C# 中的两个数组,执行集合减法的最简单方法是什么?显然,这在 Ruby 中非常容易。基本上我只想从数组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" }

4

2 回答 2

40

如果您使用的是 Linq,则可以像这样使用except 运算符

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

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

string [] c = a.Where(x=>!b.Contains(x)).ToArray();
于 2011-02-20T17:22:31.407 回答
4
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 中删除重复项。要清楚:

  1. { 'A', 'A' } - { 'A' } == { 'A' }
  2. { 'A', 'A' } - { 'A' } == { }

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

于 2011-02-20T17:34:40.993 回答