Если массив не отсортирован каким-либо образом, я не вижу, как что-либо будет быстрее, чем проверка каждого отдельного значения с использованием двух операторов for. Если он отсортирован, вы можете использовать бинарный поиск.
Edit:
Если вам нужно делать это повторно, ваш подход будет зависеть от данных. Если целые числа в этом массиве колеблются только до 256, вы можете иметь логический массив этой длины и просматривать значения в ваших данных, переключая биты внутри логического массива. Если целые числа могут варьироваться выше, вы можете использовать HashSet. Первый вызов вашей содержащейся функции будет немного медленным, потому что он должен будет проиндексировать данные. Но последующие вызовы будут O (1).
Edit1:
Это будет индексировать данные при первом запуске, в результате тестирования было установлено, что Contains требуется 0 миллисекунд для запуска после первого запуска, 13 для индексации. Если бы у меня было больше времени, я мог бы использовать многопоточность и вернуть результат, асинхронно продолжая индексирование при первом вызове. Кроме того, поскольку массивы являются ссылочными типами, изменение значения данных, переданных до или после того, как они были проиндексированы, обеспечит странную функциональность, так что это всего лишь пример и его следует реорганизовать перед использованием.
private class DataContainer
{
private readonly int[,] _data;
private HashSet<int> _index;
public DataContainer(int[,] data)
{
_data = data;
}
public bool Contains(int value)
{
if (_index == null)
{
_index = new HashSet<int>();
for (int i = 0; i < _data.GetLength(0); i++)
{
for (int j = 0; j < _data.GetLength(1); j++)
{
_index.Add(_data[i, j]);
}
}
}
return _index.Contains(value);
}
}