← Назад к вопросам

Из-за чего в List<T> можно добавить новый элемент

2.0 Middle🔥 172 комментариев
#C# и ООП#Коллекции и структуры данных

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Основные причины добавления нового элемента в List<T>

Коллекция List<T> в C# является динамическим массивом, и добавление новых элементов — одна из её ключевых функций. Это необходимо практически в любой программе, где данные не фиксированы на этапе компиляции. Ниже разберем основные причины и сценарии, сопровождаемые примерами кода.

1. Динамическое накопление данных во время выполнения программы

Часто полный набор данных неизвестен заранее. Они могут поступать из файлов, сетевых запросов, пользовательского ввода или генерироваться алгоритмами.

// Пример: сбор данных от пользователя
List<string> userNames = new List<string>();

while (true)
{
    Console.Write("Введите имя (или 'exit' для завершения): ");
    string input = Console.ReadLine();
    
    if (input.ToLower() == "exit")
        break;
        
    // Добавляем новый элемент в список
    userNames.Add(input);
    Console.WriteLine($"Добавлено имя: {input}. Общее количество: {userNames.Count}");
}

2. Агрегация результатов обработки или вычислений

При обработке коллекций (фильтрация, трансформация) результаты часто помещаются в новый или существующий список.

// Пример: фильтрация чисел и добавление подходящих в новый список
List<int> sourceNumbers = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
List<int> evenNumbers = new List<int>();

foreach (int number in sourceNumbers)
{
    if (number % 2 == 0)
    {
        // Добавляем элемент, удовлетворяющий условию
        evenNumbers.Add(number);
    }
}

// Использование LINQ для той же задачи (создает новый список внутри)
List<int> evenNumbersLinq = sourceNumbers.Where(n => n % 2 == 0).ToList();

3. Управление пулом объектов или состояниями в приложениях (например, в Unity)

В Unity List<T> чрезвычайно распространен для управления динамическими группами объектов: пул снарядов, список активных NPC, список точек пути, UI элементов и т.д.

// Пример в Unity: управление пулом объектов (например, снарядов)
using UnityEngine;
using System.Collections.Generic;

public class ProjectilePool : MonoBehaviour
{
    public List<GameObject> activeProjectiles = new List<GameObject>();
    
    public void SpawnProjectile(GameObject projectilePrefab, Vector3 position)
    {
        GameObject newProjectile = Instantiate(projectilePrefab, position, Quaternion.identity);
        // КРИТИЧНО: Добавляем новый созданный снаряд в список активных
        activeProjectiles.Add(newProjectile);
    }
    
    public void DestroyAllProjectiles()
    {
        foreach (GameObject projectile in activeProjectiles)
        {
            Destroy(projectile);
        }
        // После очистки необходимо очистить список
        activeProjectiles.Clear();
    }
}

4. Построение или расширение коллекций для последующих операций

Списки часто используются как промежуточный контейнер для данных, которые позже будут переданы в другой API, использованы для сортировки, поиска или отображения.

// Пример: сбор данных для последующей сортировки и отображения
List<PlayerScore> scores = new List<PlayerScore>();

// Добавление новых элементов из различных источников
scores.Add(new PlayerScore("Alice", 150));
scores.Add(new PlayerScore("Bob", 95));
// Добавление элемента из другого метода
scores.Add(CalculateScore("Charlie"));

// Сортировка и использование
scores.Sort((a, b) => b.Score - a.Score);
DisplayTopScores(scores);

5. Реализация структур данных или алгоритмов, требующих динамического массива

List<T> служит фундаментом для реализации стеков, очередей, графов и других структур, где количество элементов изменяется.

// Пример: простой стек на основе List<T>
public class SimpleStack<T>
{
    private List<T> _items = new List<T>();
    
    public void Push(T item)
    {
        // Добавляем элемент в конец списка (верх стека)
        _items.Add(item);
    }
    
    public T Pop()
    {
        if (_items.Count == 0)
            throw new InvalidOperationException("Stack is empty");
        
        T item = _items[_items.Count - 1];
        _items.RemoveAt(_items.Count - 1);
        return item;
    }
}

Ключевые методы для добавления элементов в List<T>

  • Add(T item): Добавляет элемент в конец списка. Основной и наиболее часто используемый метод.
  • AddRange(IEnumerable<T> collection): Добавляет несколько элементов из другой коллекции.
  • Insert(int index, T item): Добавляет элемент в указанную позицию, смещая существующие.
  • InsertRange(int index, IEnumerable<T> collection): Вставляет коллекцию элементов с указанного индекса.

Итог: Добавление новых элементов в List<T> — базовая операция, обеспечивающая гибкость работы с данными. Она обусловлена динамической природой задач: от сбора пользовательского ввода до управления объектами в реальном времени в таких средах, как Unity. Правильное использование методов добавления позволяет эффективно управлять памятью и производительностью приложения.