Как выполнить набор вычитания на массивах в C #? - PullRequest
13 голосов
/ 20 февраля 2011

Какой самый простой способ выполнить вычитание множества с использованием двух массивов в 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" }.

Ответы [ 2 ]

32 голосов
/ 20 февраля 2011

Если вы используете Linq, вы можете использовать Кроме оператора , например, так:

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

Редактировать: CodeInChaos делает хорошее замечание.Если a содержит дубликаты, он также удалит все дубликаты.Альтернатива, чтобы заставить это функционировать точно так же как версия Ruby, была бы такой:

string [] c = a.Where(x=>!b.Contains(x)).ToArray();
3 голосов
/ 20 февраля 2011
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. За исключением второго.

...