Оператор IN в C#: проверка наличия значения в списке

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

В C#, для проверки присутствия элемента в коллекции, независимо от того, является ли она массивом или списком, применяется метод Contains. Он выполняет ту же функцию, что и оператор IN в SQL. Вот наглядный пример:

csharp
Скопировать код
int[] числа = { 1, 3, 5, 7 };
int искомоеЧисло = 3;

bool найдено = числа.Contains(искомоеЧисло);

В этом контексте числа.Contains(искомоеЧисло) проверяет, есть ли искомое число в массиве чисел, что аналогично оператору IN в SQL.

Кинга Идем в IT: пошаговый план для смены профессии

Как реализовать "IN" с помощью методов расширения

Чтобы улучшить читабельность кода, особенно в случаях, когда необходимость проверки вхождения элемента в массив или список возникает часто, можно использовать метод расширения. Это делает код более изящным и делает его схожим с использованием оператора IN в SQL:

csharp
Скопировать код
public static class ExtensionMethods
{
    public static bool In<T>(this T item, params T[] list)
    {
        if (list == null)
            throw new ArgumentNullException("Пустое пространство может быть важно, но тут нулевые аргументы не приемлемы!");

        return list.Contains(item);
    }
}

Таким образом, применение становится простым и ясным:

csharp
Скопировать код
if (искомоеЧисло.In(1, 3, 5, 7))
{
    // Вывод: Число найдено!
}

Ключевое слово params позволяет передавать неограниченное количество аргументов, поэтому нет необходимости создавать массив явно.

Используем мощь LINQ

В C# существует механизм Language-Integrated Query (LINQ), с помощью которого даже без специфичного оператора IN можно написать аналогичную логику. Для таких целей служат функции Where и Any:

csharp
Скопировать код
var естьВНаличии = товары.Any(p => искомыеИдентификаторы.Contains(p.Id));

Здесь метод Any из LINQ осуществляет поиск товара по идентификатору из списка искомыеИдентификаторы, воспроизводя действие оператора IN из SQL.

Работа оператора "IN" с разными типами данных

Оператор 'IN' можно применять к различным типам данных, включая диапазоны, строки, даты или даже пользовательские объекты:

csharp
Скопировать код
if ("банан".In("яблоко", "банан", "вишня"))
{
    // Мы нашли банан. Держитесь за него!
}

Визуализация

Представим, что ищем отвертку в ящике с инструментами:

csharp
Скопировать код
var инструментарий = new List<string> { "молоток", "гаечный ключ", "отвертка", "плоскогубцы" };

if (инструментарий.Contains("отвертка")) {
    // Отлично! Мы нашли отвертку!
}

Вот так, магия!
Ящик с инструментами (🧰): [🔨, 🔧, 🪛, ⚡️]
Ищем: 🪛 (отвертка)
Результат: Отвертка найдена! (🧰➡️🪛✔️)

Бережное обращение с null

Крайне важно аккуратно обрабатывать ситуации, когда входные данные могут быть null, чтобы избежать исключений. Мы можем добавить в метод In защиту от null:

csharp
Скопировать код
public static bool SafeIn<T>(this T item, params T[] list)
{
    return list?.Contains(item) ?? false; // Теперь null-значения не страшны!
}

С Enumerable код становится красивым

Используя методы Enumerable, мы можем элегантно перенести паттерны, аналогичные SQL IN, в C#:

csharp
Скопировать код
var значимыеСчета = new [] { 100, 200, 300 };
bool рубежДостигнут = игроки.Any(игрок => значимыеСчета.Contains(игрок.Счет));

Полезные материалы

  1. Метод Enumerable.Contains (System.Linq) | Microsoft Learn – Официальная Microsoft документация по методу 'Contains' для C#.
  2. Операторы проверки типов и преобразования теста на время выполнения объекта – C# | Microsoft Learn – Информация про оператор 'is' и тестирование типов в C#.
  3. C# String Contains Examples – Dot Net Perls – Примеры использования метода 'Contains'.
  4. LINQ Equivalent of SQL IN Keyword | Stack Overflow – Дискуссия на Stack Overflow о том, как реализовать логику оператора 'IN' в SQL с помощью LINQ.
  5. Check if a list contains any of several values | Stack Overflow – Обсуждение на Stack Overflow о различных способах проверки наличия нескольких значений в списке.