Рассмотрим два массива:Метод C# LINQ для определения того, является ли массив подмножеством другого (включая дубликаты)?
int[] a1 = new int[] { 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10 };
int[] a2 = new int[] { 1, 3, 4, 7, 5, 10, 1 };
Я хочу, чтобы иметь возможность определить, если a2 является подмножеством a1, с учетом количества повторяющихся элементов.
Другими словами, если a1 имеет три «1», а a2 имеет четыре «1», то a2 не является подмножеством a1. Однако, если a1 содержит три «1», то до тех пор, пока a2 имеет три или меньше «1» в нем, его следует считать подмножеством.
Методы, использующие инструкцию LINKS 'Intersect', не работают, как и Intersect на двух массивах, каждая из которых содержит три «1», возвращает массив с одним «1». Он будет делать это независимо от того, сколько «1» находится в любом массиве; он просто ищет, существует ли элемент в обоих массивах.
Примеры (на основе массива a1 выше):
int[] a2 = new int[] { 1, 3, 4, 7, 5, 10, 1 }; // True
int[] a3 = new int[] { 1 }; // True
int[] a4 = new int[] { 9, 3, 5, 1, 1, 10, 10 }; // True
int[] a5 = new int[] { 1, 1, 1, 1, 10, 10 }; // False
int[] a6 = new int[] { 1, 2, 3, 3, 4, 5 }; // False
int[] a7 = new int[] { 10, 10, 10 }; // False
int[] a8 = new int[0]; // False
Есть ли способ для достижения желаемого результата с помощью LINQ?
Я рассмотрел довольно уродливый способ сделать это, преобразовывая все массивы в списки, итерации и удаления элементов из списков. Мне было просто любопытно, есть ли более элегантное решение.