Проверьте, все ли элементы одного массива находятся во втором массиве c# - PullRequest
1 голос
/ 27 марта 2020

Как я могу проверить, все ли элементы одного массива находятся в другом массиве? У меня есть 2d массив с 3 массивами, и я хочу проверить все эти 3 массива, если они имеют все элементы из всех чисел. массив1 = все числа? массив2 = все номера? array1 = allnumber2? Мне нужно вернуть true, если хотя бы один содержит все элементы из всех чисел. У меня есть код ниже, но мне нужно, чтобы он не содержал более 3 операторов потока управления.

// int[,][] array = {array1, array2, array3}
static bool CheckLine(int[,][] array)
        {
            const int maxL = 9;
            bool result = false;
            int[] allnumbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            foreach (var singlearray in array)
            {
                int[] arr = singlearray;
                int p = 0;
                foreach (var num in allnumbers)
                {
                    foreach (var arraynumber in singlearray)
                    {
                        if (arraynumber == num)
                        {
                            p++;
                        }
                    }

                    if (p == maxL)
                    {
                        result = true;
                        break;
                    }
                }
            }

            return result;
        }

Ответы [ 3 ]

2 голосов
/ 27 марта 2020

Если значения в вашем массиве уникальны, и вам не важно, в каком порядке они находятся, это задание для HashSet . (Другими словами, если ваши массивы содержат наборы чисел, вы можете рассматривать их как наборы.) Вот базовый c план сравнения наборов.

var allnumbersSet = new HashSet<int>(allnumbers);
var allnumbers2Set= new HashSet<int>(allnumbers2);

if (allnumbersSet.IsSupersetOf(allnumbers2Set)) {
   /* everything in allnumbers2 is also in allnumbers1 */
}

Люди, которые собрали вместе, сделали tNet действительно хорошая работа по созданию и оптимизации этих коллекционных классов; Вы можете использовать их с уверенностью, чтобы получить хорошую производительность.

1 голос
/ 27 марта 2020

Кажется, у вас есть двумерный зубчатый массив . Вы можете упростить свой код, используя Except и проверять разницу между массивом allnumbers и одной строкой на каждой итерации l oop.

static bool CheckLine(int[,][] array)
{
    int[] allnumbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    foreach (var singlearray in array)
    {
        var diff = allnumbers.Except(singlearray);
        if (!diff.Any())
        {
            return true;
        }
    }

    return false;
}

Если в разнице нет элементов, это будет означать, что один элемент из исходного 2D-массива имеет все элементы из allnumbers массива.

Пример использования

var array = new int[2, 2][];
array[0, 0] = new[] { 1, 2, 8 };
array[0, 1] = new[] { 3, 4, 5, 6 };
array[1, 1] = new[] { 3, 2, 1, 4, 5, 7, 6, 10, 9, 8 };
array[1, 0] = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

CheckLine(array);

Последние два элемента удовлетворяют условию, выполнение прервется и вернет true для массива { 3, 2, 1, 4, 5, 7, 6, 10, 9, 8 }. Также не забудьте добавить директиву using System.Linq вверху файла

0 голосов
/ 27 марта 2020

Спасибо за вашу помощь. Я забыл упомянуть, что могу использовать только «using System»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...