fa
Feedback
C# | Вопросы собесов

C# | Вопросы собесов

رفتن به کانال در Telegram
5 059
مشترکین
-524 ساعت
-77 روز
-1730 روز
آرشیو پست ها
🤔 Интерполяция - это возможность использовать в строке переменные? Да, интерполяция строк — это удобный способ вставки значений переменных в строку без использования конкатенации (+) или String.Format(). Простой пример интерполяции строк
string name = "Иван";
int age = 25;

string message = $"Привет, меня зовут {name}, и мне {age} лет.";
Console.WriteLine(message);
Вывод
Привет, меня зовут Иван, и мне 25 лет.
🚩Дополнительные возможности интерполяции 🟠Форматирование значений Можно форматировать числа и даты прямо в строке:
double price = 99.99;
DateTime today = DateTime.Now;

string formatted = $"Цена: {price:C}, Дата: {today:dd.MM.yyyy}";
Console.WriteLine(formatted);
Вывод
Цена: 99,99 ₽, Дата: 01.03.2025
🟠Выполнение выражений Можно вставлять даже арифметические операции и вызовы методов:
int a = 10, b = 5;
string mathResult = $"Сумма: {a + b}, Разница: {a - b}";
Console.WriteLine(mathResult);
Вывод
Сумма: 15, Разница: 5
🟠Экранирование фигурных скобок Если нужно вывести {} в тексте, их надо удваивать:
Console.WriteLine($"JSON: {{ \"name\": \"Иван\" }}");
Вывод
JSON: { "name": "Иван" }
Ставь 👍 и забирай 📚 Базу знаний

🤔 В чём разница абстрактного класса и интерфейса? Абстрактный класс может содержать как реализацию методов, так и абстрактные методы, а интерфейс — только определения методов без реализации. Абстрактные классы могут иметь поля и конструкторы, а интерфейсы — нет. Класс может наследовать только один абстрактный класс, но реализовать несколько интерфейсов. Интерфейсы предоставляют более гибкий способ организации контракта для классов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие бывают типы данных? В C# существует множество различных типов данных, которые можно разделить на две основные категории: значимые типы (value types) и ссылочные типы (reference types). Рассмотрим каждую из этих категорий и их подтипы. 🚩Значимые типы (Value Types) Значимые типы хранят данные непосредственно в своей памяти. Они обычно располагаются в стеке и имеют фиксированный размер. К значимым типам относятся: 🟠Простые типы (Simple Types) Числовые типы Целочисленные типы: byte (8 бит) sbyte (8 бит) short (16 бит) ushort (16 бит) int (32 бита) uint (32 бита) long (64 бита) ulong (64 бита) Вещественные типы: float (32 бита) double (64 бита) Десятичный тип: decimal (128 бит) Логический тип bool (1 бит, значения true или false) Символьный тип char (16 бит, символы в формате Unicode) 🟠Структуры (Structs) Пользовательские типы, которые могут содержать поля, свойства и методы. Пример: struct Point { public int X; public int Y; } 🟠Перечисления (Enums) Специальные типы, представляющие набор именованных констант. Пример: enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } 🟠Nullable Types Типы, которые могут принимать значение null. Пример: int?, double? 🚩Ссылочные типы (Reference Types) 🟠Классы (Classes) Основные объекты в C#, могут содержать поля, свойства, методы и события. Пример: class Person { public string Name; public int Age; } 🟠Интерфейсы (Interfaces) Определяют контракт, который должны реализовать классы. Пример: interface IMovable { void Move(); } 🟠Массивы (Arrays) Коллекции однотипных элементов. Пример: int[] numbers = new int[5]; 🟠Делегаты (Delegates) Типы, которые представляют собой ссылки на методы. Пример: delegate void Process(int value); 🟠Строки (Strings) Непосредственно представляют собой последовательность символов. Пример: string message = "Hello, World!"; 🟠Записи (Records) Новый тип в C# 9.0, предназначенный для неизменяемых объектов. Пример: record Person(string Name, int Age); 🚩Примеры и использование Значимые типы
int a = 5;
float b = 3.14f;
bool isTrue = true;
char letter = 'A';
Ссылочные типы
string message = "Hello, World!";
Person person = new Person { Name = "Alice", Age = 30 };

int[] numbers = new int[] { 1, 2, 3, 4, 5 };
Ставь 👍 и забирай 📚 Базу знаний

🤔 Для чего нужны примитивы синхронизации? Примитивы синхронизации используются для управления доступом к общим ресурсам, чтобы избежать ошибок, когда потоки вмешиваются в работу друг друга. Они помогают обеспечить безопасное и последовательное выполнение в многопоточном окружении. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое Redis? Это система управления базами данных с открытым исходным кодом, работающая в памяти и поддерживающая множество типов данных, таких как строки, списки, множества, хеши и другие. Redis часто используется как кэш, брокер сообщений и база данных. Он известен своей высокой производительностью, низкой задержкой и простотой в использовании. 🚩Особенности 🟠Работа в памяти Redis хранит все данные в памяти, что обеспечивает очень быструю скорость чтения и записи. Данные также могут периодически сохраняться на диск для обеспечения долговечности. 🟠Поддержка различных типов данных Строки (Strings): Самый простой тип данных в Redis, который может содержать текст или двоичные данные. Списки (Lists): Упорядоченные коллекции строк, которые можно использовать как очереди или стеки. Множества (Sets): Неупорядоченные коллекции уникальных строк. Упорядоченные множества (Sorted Sets): Коллекции уникальных строк, каждая из которых связана с числовым значением (score), определяющим порядок. Хеши (Hashes): Коллекции пар "ключ-значение", где каждый хеш связан с ключом. Bitmaps и HyperLogLogs: Для эффективного хранения и обработки больших объемов данных. 🟠Высокая производительность Благодаря хранению данных в памяти и простому протоколу клиент-сервер, Redis обеспечивает очень высокую скорость операций. 🟠Поддержка репликации Redis поддерживает мастер-слейв репликацию, что позволяет создать резервные копии данных и обеспечить отказоустойчивость. 🟠Кластеризация Redis Cluster позволяет распределить данные по нескольким узлам, обеспечивая горизонтальную масштабируемость. 🟠Поддержка Lua-скриптов Redis позволяет выполнять атомарные операции с помощью Lua-скриптов. 🟠Транзакции Redis поддерживает транзакции, позволяя выполнить несколько команд атомарно. 🚩Примеры использования 🟠Кэширование Redis часто используется для кэширования данных, что позволяет значительно уменьшить задержку доступа и снизить нагрузку на базу данных.
using StackExchange.Redis;
using System;

class Program
{
    static void Main()
    {
        ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
        IDatabase db = redis.GetDatabase();

        db.StringSet("key", "value");
        string value = db.StringGet("key");

        Console.WriteLine(value);
    }
}
🟠Сессии Хранение сессий пользователя для веб-приложений, что обеспечивает быстрое и эффективное управление состоянием. 🟠Очереди сообщений Использование списков или упорядоченных множеств для организации очередей сообщений.
using StackExchange.Redis;
using System;

class Program
{
    static void Main()
    {
        ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
        IDatabase db = redis.GetDatabase();

        db.ListLeftPush("queue", "task1");
        db.ListLeftPush("queue", "task2");

        string task = db.ListRightPop("queue");
        Console.WriteLine(task);
    }
}
🟠Счетчики и рейтинги Использование упорядоченных множеств для реализации счетчиков, рейтингов или систем рекомендаций.
using StackExchange.Redis;
using System;

class Program
{
    static void Main()
    {
        ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
        IDatabase db = redis.GetDatabase();

        // Add scores for users
        db.SortedSetAdd("scores", "user1", 100);
        db.SortedSetAdd("scores", "user2", 200);

        // Retrieve scores with scores included
        var scores = db.SortedSetRangeByRankWithScores("scores", 0, -1);

        foreach (var score in scores)
        {
            Console.WriteLine($"{score.Element}: {score.Score}");
        }
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Может ли pipeline не обрабатывать HTTP-запросы? Да, может. Пайплайн — это обобщённое понятие, означающее цепочку обработки данных. Он может использоваться для чего угодно: логирования, обработки событий, работы с файлами и т.д. Если это HTTP-пайплайн, то он заточен под HTTP. Но в общем случае — pipeline может вообще не иметь отношения к HTTP. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Можно ли передать значимый тип данных по ссылке? Да, можно! По умолчанию значимые типы (структуры, int, double) передаются по значению. Но их можно передать по ссылке с помощью ref или out. 🚩Передача по значению (обычное поведение) Копия передаётся в метод, а оригинал не меняется.
void ChangeValue(int number)
{
    number = 10; // Изменится только копия
}

int x = 5;
ChangeValue(x);
Console.WriteLine(x); // 5 (значение не изменилось)
🚩Передача значимого типа по ссылке (`ref`) Позволяет менять оригинальную переменную.
void ChangeValue(ref int number)
{
    number = 10; // Меняем оригинальное значение
}

int x = 5;
ChangeValue(ref x);
Console.WriteLine(x); // 10 (значение изменилось)
🚩Использование `out` (без начального значения) out тоже передаёт по ссылке, но требует обязательного присвоения внутри метода.
void InitializeValue(out int number)
{
    number = 100; // Обязательно присваиваем значение
}

int x;
InitializeValue(out x);
Console.WriteLine(x); // 100
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое связанность и связность? 1. Связанность (Coupling): - Мера зависимости между модулями системы. - Чем слабее связность, тем легче изменять и тестировать код. 2. Связность (Cohesion): - Мера, насколько хорошо элементы внутри модуля связаны друг с другом. - Высокая связность означает, что модуль выполняет одну задачу. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какая есть классификация у кучи? В информатике и программировании куча (heap) может классифицироваться по нескольким критериям. Рассмотрим основные виды: 🟠По назначению: Куча памяти (Memory Heap) Используется для динамического выделения памяти в приложениях. В C# это управляется сборщиком мусора (GC - Garbage Collector). Примеры: объекты, созданные с помощью new, выделяются в управляемой куче. 🟠Структура данных «Куча» (Heap Data Structure) Это специальная бинарная структура данных, используемая в алгоритмах, например, в сортировке (Heap Sort) или в приоритетных очередях. Бывает максимальная куча (max-heap) и минимальная куча (min-heap). 🚩По типу управления памятью (для кучи памяти в языках программирования): 🟠Управляемая куча (Managed Heap) В C# и .NET память выделяется и освобождается автоматически с помощью GC. Разделяется на поколения (Generation 0, 1, 2), что оптимизирует работу сборщика мусора. 🟠Неуправляемая куча (Unmanaged Heap) Применяется в C/C++ и низкоуровневом коде, где управление памятью выполняется вручную (malloc/free, new/delete). В C# тоже можно работать с ней через Marshal или Unsafe код. 🟠По структуре данных (Heap Data Structure): 🟠Максимальная куча (Max Heap) Корневой узел содержит наибольшее значение, а дочерние узлы – меньшее. Используется в алгоритмах приоритетных очередей. 🟠Минимальная куча (Min Heap) Корневой узел содержит наименьшее значение, а дочерние узлы – большее. Применяется в алгоритме Дейкстры и других задачах.
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        PriorityQueue<int, int> minHeap = new PriorityQueue<int, int>();

        minHeap.Enqueue(5, 5);
        minHeap.Enqueue(3, 3);
        minHeap.Enqueue(8, 8);
        minHeap.Enqueue(1, 1);

        while (minHeap.Count > 0)
        {
            Console.WriteLine(minHeap.Dequeue()); // Выведет: 1, 3, 5, 8
        }
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое сборщик мусора? Сборщик мусора — это механизм автоматического управления памятью, который отслеживает каждый объект в системе и удаляет те объекты, на которые больше нет ссылок, автоматически освобождая ресурсы и предотвращая утечки памяти. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие есть способы (протоколы) обмена данными между сервером и клиентом? При взаимодействии клиента и сервера используются различные*протоколы обмена данными, в зависимости от задачи, скорости, надежности и реального времени. 🚩HTTP(S) – стандартный протокол веба Клиент (браузер, мобильное приложение) делает запрос к серверу. Сервер отправляет ответ с данными (HTML, JSON, XML). Использует методы: GET, POST, PUT, DELETE и т. д.
fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data));
🚩WebSocket – двусторонняя связь в реальном времени Клиент устанавливает постоянное соединение с сервером. Сервер и клиент могут отправлять друг другу данные в любое время. Используется для чата, онлайн-игр, бирж, обновлений в реальном времени.
const socket = new WebSocket('wss://example.com/socket');

socket.onopen = () => socket.send('Привет, сервер!');
socket.onmessage = event => console.log('Сообщение от сервера:', event.data);
🚩SSE (Server-Sent Events) – поток данных от сервера Клиент делает HTTP-запрос, но соединение не закрывается. Сервер постепенно отправляет данные в виде событий (event-stream). Используется для новостей, биржевых данных, уведомлений.
const eventSource = new EventSource('/events');

eventSource.onmessage = event => console.log('Новое сообщение:', event.data);
🚩gRPC – быстрый RPC поверх HTTP/2 Клиент вызывает удаленные методы напрямую как обычные функции. Работает на HTTP/2, использует бинарный формат Protocol Buffers (быстрее, чем JSON). Используется для высокопроизводительных API, микросервисов.
import grpc
import my_service_pb2
import my_service_pb2_grpc

channel = grpc.insecure_channel('localhost:50051')
stub = my_service_pb2_grpc.MyServiceStub(channel)
response = stub.MyMethod(my_service_pb2.MyRequest(name="Alice"))
print(response.message)
🚩MQTT – лёгкий протокол для IoT Работает по модели издатель/подписчик. Клиент подписывается на тему (topic) и получает сообщения, когда кто-то публикует данные. Используется для умных устройств, датчиков, IoT.
const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://broker.hivemq.com');

client.on('connect', () => {
    client.subscribe('myTopic');
    client.publish('myTopic', 'Привет, MQTT!');
});

client.on('message', (topic, message) => {
    console.log(`Сообщение из ${topic}: ${message.toString()}`);
});
Ставь 👍 и забирай 📚 Базу знаний

Такси для бизнеса. Яндекс Go Оптимизируйте свои расходы и повысьте эффективность бизнеса с Яндекс Go Узнать больше #реклама b
Такси для бизнеса. Яндекс Go Оптимизируйте свои расходы и повысьте эффективность бизнеса с Яндекс Go Узнать больше #реклама business.go.yandex О рекламодателе

🤔 Где используется IQueryable? IQueryable используется для создания запросов к источникам данных с возможностью отложенного выполнения. Оно позволяет строить сложные запросы, которые преобразуются в SQL-запросы или другие команды на этапе выполнения. Часто используется с ORM, такими как Entity Framework. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Расскажи про конкурентные коллекции? Конкурентные коллекции — это специализированные коллекции, которые обеспечивают безопасное выполнение операций в многопоточной среде. В стандартной библиотеке .NET существуют несколько типов таких коллекций, каждая из которых предназначена для различных сценариев использования. Давайте рассмотрим основные из них. 🟠ConcurrentDictionary<TKey, TValue> Это словарь, который позволяет безопасно добавлять, удалять и изменять элементы из нескольких потоков одновременно. Он реализует интерфейс IDictionary<TKey, TValue>.
var concurrentDictionary = new ConcurrentDictionary<int, string>();
concurrentDictionary.TryAdd(1, "value1");
concurrentDictionary.TryAdd(2, "value2");

string value;
if (concurrentDictionary.TryGetValue(1, out value))
{
    Console.WriteLine(value);  // Output: value1
}
🟠ConcurrentQueue<T> Это очередь, которая обеспечивает безопасное добавление элементов в конец и извлечение из начала в многопоточной среде. Она реализует интерфейс IProducerConsumerCollection<T>.
var concurrentQueue = new ConcurrentQueue<int>();
concurrentQueue.Enqueue(1);
concurrentQueue.Enqueue(2);

int result;
if (concurrentQueue.TryDequeue(out result))
{
    Console.WriteLine(result);  // Output: 1
}
🟠ConcurrentStack<T> Это стек, который обеспечивает безопасное добавление и извлечение элементов в многопоточной среде. Он также реализует интерфейс IProducerConsumerCollection<T>.
var concurrentStack = new ConcurrentStack<int>();
concurrentStack.Push(1);
concurrentStack.Push(2);

int result;
if (concurrentStack.TryPop(out result))
{
    Console.WriteLine(result);  // Output: 2
}
🟠ConcurrentBag<T> Это коллекция, которая позволяет безопасно добавлять и извлекать элементы в многопоточной среде. Она не гарантирует порядок элементов, поэтому используется в случаях, когда порядок не имеет значения.
var concurrentBag = new ConcurrentBag<int>();
concurrentBag.Add(1);
concurrentBag.Add(2);

int result;
if (concurrentBag.TryTake(out result))
{
    Console.WriteLine(result);  // Output: 1 или 2
}
🟠BlockingCollection<T> Это коллекция, которая поддерживает ограниченную емкость и блокировку потоков при добавлении или извлечении элементов. Она особенно полезна для реализации паттернов продюсер-потребитель.
var blockingCollection = new BlockingCollection<int>(boundedCapacity: 5);
Task.Run(() =>
{
    for (int i = 0; i < 10; i++)
    {
        blockingCollection.Add(i);
        Console.WriteLine($"Added {i}");
    }
    blockingCollection.CompleteAdding();
});

foreach (var item in blockingCollection.GetConsumingEnumerable())
{
    Console.WriteLine($"Consumed {item}");
}
Ставь 👍 и забирай 📚 Базу знаний

Подключите высокоскоростной интернет в офис от МегаФона Доступ в интернет для компаний с выделенным каналом на высоких скорос
Подключите высокоскоростной интернет в офис от МегаФона Доступ в интернет для компаний с выделенным каналом на высоких скоростях — до 10 Гбит/с — Собственные дата-центры и оборудование ведущих мировых производителей обеспечивают бесперебойную связь — Высокая скорость передачи данных благодаря собственной магистральной IP/MPLS-сети МегаФона. Общая пропускная способность — более 1000 Гбит/с — Архив 180 дней (хранение записи в облаке до 180 дней) — Постоянный безлимитный интернет в любой точке России Перейти на сайт #реклама megafon.ru О рекламодателе

🤔 Когда сравниваются String, мы сравниваем ссылки? В .NET: - При использовании оператора == или метода Equals() для строк — сравниваются значения, а не ссылки. - Однако сравнение через ReferenceEquals() — это сравнение ссылок. Важно: строки в .NET иммутабельны и могут быть интернированы, то есть одинаковые строковые литералы могут указывать на одну и ту же область памяти. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие есть модификаторы доступа? Есть модификаторы доступа, которые определяют, кто может использовать классы, методы и переменные. Они помогают скрыть внутренние детали кода и контролировать доступ к данным. 🚩Подробное объяснение с примерами 🟠`public` (Открытый доступ) Открытый доступ означает, что элемент можно использовать везде.
public class Car
{
    public string Model = "Tesla";
}

class Program
{
    static void Main()
    {
        Car car = new Car();
        Console.WriteLine(car.Model); // Доступ открыт
    }
}
🟠`private` (Только внутри класса) Самый закрытый модификатор. Поля и методы невидимы за пределами класса.
class Car
{
    private string model = "Tesla";

    private void PrintModel()
    {
        Console.WriteLine(model);
    }
}

class Program
{
    static void Main()
    {
        Car car = new Car();
        // car.model = "BMW";   Ошибка! Поле `model` — private
        // car.PrintModel();  Ошибка! Метод `PrintModel` — private
    }
}
🟠`protected` (Доступен в наследниках) Доступен только внутри класса и его наследников.
class Car
{
    protected string Model = "Tesla";
}

class ElectricCar : Car
{
    public void ShowModel()
    {
        Console.WriteLine(Model); //  Можно, потому что наследуемый класс
    }
}

class Program
{
    static void Main()
    {
        ElectricCar eCar = new ElectricCar();
        // eCar.Model  Ошибка! Поле `Model` доступно только в наследниках
    }
}
🟠`internal` (Только внутри проекта) Элементы с internal можно использовать только внутри одной сборки (проекта).
internal class Engine
{
    public void Start() => Console.WriteLine("Двигатель запущен");
}

class Program
{
    static void Main()
    {
        Engine engine = new Engine();
        engine.Start(); //  Работает, потому что внутри того же проекта
    }
}
🟠`protected internal` (В сборке и у наследников) Этот модификатор разрешает доступ внутри сборки, а также в классах-наследниках за её пределами.
public class Car
{
    protected internal string Model = "Tesla";
}

class ElectricCar : Car
{
    public void ShowModel()
    {
        Console.WriteLine(Model); //  Можно, потому что наследник
    }
}
🟠`private protected` (Только в классе и наследниках из той же сборки) Этот модификатор ещё жёстче, чем protected internal: - Доступ внутри класса – да - В наследниках – только внутри той же сборки - В других проектах – нет доступа!
class Car
{
    private protected string Model = "Tesla";
}

class ElectricCar : Car
{
    public void ShowModel()
    {
        Console.WriteLine(Model); //  Можно, потому что наследник в той же сборке
    }
}

class Program
{
    static void Main()
    {
        ElectricCar eCar = new ElectricCar();
        // eCar.Model  Ошибка! `Model` доступен только в наследниках из этой сборки
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое идентификация, аутентификация и авторизация? Идентификация — это процесс определения личности пользователя (например, через логин). Аутентификация проверяет подлинность предоставленных данных, подтверждая, что пользователь тот, за кого себя выдаёт (например, с помощью пароля). Авторизация определяет уровень доступа пользователя к ресурсам на основе его роли или прав. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем разница между FirstOfDefault и SingleOfDefault? Методы FirstOrDefault и SingleOrDefault в LINQ используются для извлечения элементов из коллекции, но их логика работы отличается. Давайте разберем их подробно, с примерами. 🚩FirstOrDefault FirstOrDefault возвращает первый элемент коллекции, который удовлетворяет условию (если условие указано), или первый элемент вообще, если условие отсутствует. Если в коллекции нет элементов, метод возвращает значение по умолчанию для типа (например, null для ссылочных типов или 0 для чисел). Когда вас интересует первый элемент коллекции, но коллекция может быть пустой. Когда вам неважно, есть ли другие элементы, соответствующие условию.
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

// Возьмем первый элемент, который больше 3
int result = numbers.FirstOrDefault(n => n > 3); // result = 4

// Если условие не выполняется
int result2 = numbers.FirstOrDefault(n => n > 10); // result2 = 0 (default для int)

// Если коллекция пустая
List<int> emptyList = new List<int>();
int result3 = emptyList.FirstOrDefault(); // result3 = 0
🚩SingleOrDefault SingleOrDefault возвращает единственный элемент из коллекции, который удовлетворяет условию. Если такого элемента нет, метод возвращает значение по умолчанию. Однако если в коллекции есть более одного элемента, удовлетворяющего условию, будет выброшено исключение (InvalidOperationException). Когда вы ожидаете, что в коллекции будет ровно один элемент, соответствующий условию. Когда наличие нескольких подходящих элементов является ошибкой и вы хотите это обработать.
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

// Возьмем единственный элемент, равный 3
int result = numbers.SingleOrDefault(n => n == 3); // result = 3

// Если элемента, соответствующего условию, нет
int result2 = numbers.SingleOrDefault(n => n > 10); // result2 = 0

// Если элементов больше одного, возникает исключение
List<int> duplicateNumbers = new List<int> { 1, 2, 3, 3, 4 };
try
{
    int result3 = duplicateNumbers.SingleOrDefault(n => n > 2);
}
catch (InvalidOperationException ex)
{
    Console.WriteLine(ex.Message); // Ошибка: последовательность содержит несколько элементов
}
Ставь 👍 и забирай 📚 Базу знаний