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

时间:2011-02-20 17:19:23

标签: c# arrays set-operations

在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" }

2 个答案:

答案 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中删除重复项。要明确:

  1. {'A','A'} - {'A'} == {'A'}
  2. {'A','A'} - {'A'} == {}
  3. 我做第一个,Enumerable.Except做第二个。