Как выполнить набор вычитания на массивах в C#?
Какой самый простой способ выполнить вычитание набора с учетом двух массивов в 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 ответа
Решение
Если вы используете Linq, вы можете использовать оператор Except следующим образом:
string [] c = a.Except(b).ToArray();
Изменить: CodeInChaos делает хорошую мысль. Если a
содержит дубликаты, он также удалит все дубликаты. Альтернатива, чтобы заставить это функционировать точно так же как версия Ruby, была бы такой:
string [] c = a.Where(x=>!b.Contains(x)).ToArray();
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. Чтобы было ясно:
- {'A', 'A'} - {'A'} == {'A'}
- {'A', 'A'} - {'A'} == {}
Я делаю первое, Enumerable. За исключением второго.