Оператор IN в C#: проверка наличия значения в списке
Быстрый ответ
В C#, для проверки присутствия элемента в коллекции, независимо от того, является ли она массивом или списком, применяется метод Contains
. Он выполняет ту же функцию, что и оператор IN
в SQL. Вот наглядный пример:
int[] числа = { 1, 3, 5, 7 };
int искомоеЧисло = 3;
bool найдено = числа.Contains(искомоеЧисло);
В этом контексте числа.Contains(искомоеЧисло)
проверяет, есть ли искомое число в массиве чисел, что аналогично оператору IN
в SQL.
Как реализовать "IN" с помощью методов расширения
Чтобы улучшить читабельность кода, особенно в случаях, когда необходимость проверки вхождения элемента в массив или список возникает часто, можно использовать метод расширения. Это делает код более изящным и делает его схожим с использованием оператора IN
в SQL:
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);
}
}
Таким образом, применение становится простым и ясным:
if (искомоеЧисло.In(1, 3, 5, 7))
{
// Вывод: Число найдено!
}
Ключевое слово params
позволяет передавать неограниченное количество аргументов, поэтому нет необходимости создавать массив явно.
Используем мощь LINQ
В C# существует механизм Language-Integrated Query (LINQ), с помощью которого даже без специфичного оператора IN
можно написать аналогичную логику. Для таких целей служат функции Where
и Any
:
var естьВНаличии = товары.Any(p => искомыеИдентификаторы.Contains(p.Id));
Здесь метод Any
из LINQ осуществляет поиск товара по идентификатору из списка искомыеИдентификаторы
, воспроизводя действие оператора IN
из SQL.
Работа оператора "IN" с разными типами данных
Оператор 'IN' можно применять к различным типам данных, включая диапазоны, строки, даты или даже пользовательские объекты:
if ("банан".In("яблоко", "банан", "вишня"))
{
// Мы нашли банан. Держитесь за него!
}
Визуализация
Представим, что ищем отвертку в ящике с инструментами:
var инструментарий = new List<string> { "молоток", "гаечный ключ", "отвертка", "плоскогубцы" };
if (инструментарий.Contains("отвертка")) {
// Отлично! Мы нашли отвертку!
}
Вот так, магия!
Ящик с инструментами (🧰): [🔨, 🔧, 🪛, ⚡️]
Ищем: 🪛 (отвертка)
Результат: Отвертка найдена! (🧰➡️🪛✔️)
Бережное обращение с null
Крайне важно аккуратно обрабатывать ситуации, когда входные данные могут быть null, чтобы избежать исключений. Мы можем добавить в метод In
защиту от null:
public static bool SafeIn<T>(this T item, params T[] list)
{
return list?.Contains(item) ?? false; // Теперь null-значения не страшны!
}
С Enumerable код становится красивым
Используя методы Enumerable
, мы можем элегантно перенести паттерны, аналогичные SQL IN
, в C#:
var значимыеСчета = new [] { 100, 200, 300 };
bool рубежДостигнут = игроки.Any(игрок => значимыеСчета.Contains(игрок.Счет));
Полезные материалы
- Метод Enumerable.Contains (System.Linq) | Microsoft Learn – Официальная Microsoft документация по методу 'Contains' для C#.
- Операторы проверки типов и преобразования теста на время выполнения объекта – C# | Microsoft Learn – Информация про оператор 'is' и тестирование типов в C#.
- C# String Contains Examples – Dot Net Perls – Примеры использования метода 'Contains'.
- LINQ Equivalent of SQL IN Keyword | Stack Overflow – Дискуссия на Stack Overflow о том, как реализовать логику оператора 'IN' в SQL с помощью LINQ.
- Check if a list contains any of several values | Stack Overflow – Обсуждение на Stack Overflow о различных способах проверки наличия нескольких значений в списке.