Сравнение одного значения с целым массивом? (С #) - PullRequest
14 голосов
/ 05 апреля 2010

Допустим, у меня есть переменная C # и массив:

int variable_1 = 1;
int[3] array_1 = {1,2,3};

Как я могу проверить, равняется ли значение variable_1 любому из значений в array_1, не просматривая array_1?

Ответы [ 3 ]

26 голосов
/ 05 апреля 2010

Ну что-то должно зацикливаться. Будет работать любое из следующего:

bool exists = array.Contains(variable_1);
bool exists = Array.IndexOf(array_1, variable_1) != -1;
bool exists = Array.Exists(array_1, x => x == variable_1);
bool exists = Array.FindIndex(array_1, x => x == variable_1) != -1;
bool exists = array_1.Any(x => x == variable_1);

Все версии, использующие лямбда-выражения, кажутся мне излишними, но они потенциально полезны, если вы окажетесь в ситуации, когда вы не знаете фактическое значение, которое вы ищете - только какое-то условие. 1006 *

Если вы знаете, что массив отсортирован, вы можете использовать:

bool exists = Array.BinarySearch(array_1, variable_1) >= 0;

Это будет O (log n), а не O (n) (как и все остальные), но для этого необходимо сначала отсортировать массив.

Лично я бы обычно использовал самую первую форму, предполагая, что вы используете .NET 3.5 или выше.

Если вам нужно проверить несколько элементов и массив большой, вы можете создать HashSet<int>:

HashSet<int> hashSet = new HashSet<int>(array_1);
bool exists = hashSet.Contains(variable_1);
18 голосов
/ 05 апреля 2010

в 3,5 и выше

array_1.Contains(variable_1);

или 2,0

array_1.IndexOf(variable_1) != -1

Обновлено: для экономии производительности

1 голос
/ 05 апреля 2010

ммм возможны различные варианты,

var hasItem = Array.Exists(array_1, x => x == variable_1);
...