Проверка на вхождение элемента в массив

268
29 октября 2017, 16:54

Добрый вечер!
Есть двумерный массив arr и некорректная проверка на вхождение цифры 1.

byte[,] arr = new byte[,]{{1, 1, 1}, {1, 1, 1}}; // массив arr
if (arr.Exists (1)) { // проверка на вхождение
// ...
}

Как правильно записать условие?

Answer 1

Вариант с расширяющим методом

public static class SquareArrayExtension
{
    public static bool Contains(this byte[,] array, byte value)
    {
        for (int i = 0; i < array.GetLength(0); i++)
        {
            for (int j = 0; j < array.GetLength(1); j++)
            {
                if (value == array[i, j])
                {
                    return true;
                }
            }
        }
        return false;
    }
}

Пользоваться так

static void Main(string[] args)
{
    byte[,] array =
    {
        { 1, 1, 1},
        { 1, 1, 1}
    };
    bool exists = array.Contains(5);
    Console.WriteLine(exists);
    Console.ReadLine();
}
Answer 2

Приведите свой массив к IEnumerable и можете использовать Linq:

if (arr.Cast<byte>().Any(x => x == 1))
Answer 3

Напишу два решения - для случая когда данных достаточно много и когда нужно проверять вхождение много раз, для такого случая наиболее быстрым будет использовать HashSet, а также для случая если массив не большой или запросов не много, для этого достаточно простой проверки циклом.

Вот код на C#, можно запустить онлайн:

using System;
using System.Collections.Generic;
class ArrayContains
{
    static void Main() {
        byte[,] arr = {{1, 2, 3}, {4, 5, 6}};
        byte to_check = 3;
        // Простейшее медленное решение.
        foreach (byte b in arr) {
            if (b == to_check) {
                Console.WriteLine("Contains!");
                break;
            }
        }
        // Немного более сложное решение значительно более быстрое.
        HashSet<byte> checker = new HashSet<byte>();
        foreach (byte b in arr) checker.Add(b);
        if (checker.Contains(to_check)) Console.WriteLine("Contains!");
    }
}
READ ALSO
Упаковка ValueType при использовании IEnumerable

Упаковка ValueType при использовании IEnumerable

Допустим, имеется некий массив, например:

301
JS функция не срабатывает [дубликат]

JS функция не срабатывает [дубликат]

На данный вопрос уже ответили:

279
History - событие popstate

History - событие popstate

Задача следующая:

338
id is not defined

id is not defined

Каждому подключенному модулю задан id с соответствующим именемПри нажатии на ссылку нужно узнавать id этой ссылки, и загружать модуль с названием...

323