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

Можно ли динамически изменить List?

1.0 Junior🔥 181 комментариев
#C# и ООП#Коллекции и структуры данных

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

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

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

Можно ли динамически изменить List<T> в Unity/C#?

Да, List<T> в C# (и, соответственно, в Unity) является динамическим по своей сути. Это одна из его ключевых характеристик, отличающая его от статического массива (T[]). Под "динамическим изменением" понимается возможность изменять размер списка и его содержимое после создания, без необходимости явного управления памятью или пересоздания структуры данных.

Основные операции для динамического изменения List<T>

1. Добавление элементов

Для расширения списка используются методы Add() и AddRange().

List<int> numbers = new List<int>() { 1, 2, 3 };
// Добавить один элемент
numbers.Add(4); // Список станет: [1, 2, 3, 4]

// Добавить несколько элементов из другой коллекции
numbers.AddRange(new int[] { 5, 6 }); // Список станет: [1, 2, 3, 4, 5, 6]

2. Удаление элементов

Для сокращения списка используются методы Remove(), RemoveAt() и RemoveAll().

List<string> items = new List<string>() { "A", "B", "C", "D" };
// Удалить элемент по значению (первое найденное)
items.Remove("B"); // Список станет: ["A", "C", "D"]

// Удалить элемент по индексу
items.RemoveAt(0); // Удалит "A". Список станет: ["C", "D"]

// Удалить все элементы, удовлетворяющие условию (например, начинающиеся на "C")
items.RemoveAll(item => item.StartsWith("C")); // Удалит "C". Список станет: ["D"]

3. Изменение элементов

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

List<float> values = new List<float>() { 1.0f, 2.0f, 3.0f };
values[1] = 2.5f; // Изменяем второй элемент. Список станет: [1.0f, 2.5f, 3.0f]

4. Очистка списка

Метод Clear() полностью удаляет все элементы, но сам объект списка остается.

items.Clear(); // items теперь пустой List<string>, но готов к новым операциям добавления.

5. Вставка элементов в произвольную позицию

Метод Insert() позволяет добавить элемент в середину списка, смещая существующие элементы.

numbers.Insert(2, 99); // Вставляет 99 на позицию с индексом 2 (третье место). 
// Исходный список [1, 2, 3, 4] станет [1, 2, 99, 3, 4]

Внутренняя реализация и производительность

Важно понимать, как List<T> работает внутри, чтобы использовать его эффективно в Unity, особенно при работе с большими объемами данных или в циклах Update.

  • Динамический массив: List<T> внутри использует обычный массив (T[]). При создании задается начальная Capacity (емкость). Когда элементы добавляются и внутренний массив заполняется, происходит автоматическое расширение (resizing): создается новый массив большего размера (обычно вдвое), все элементы копируются в него. Это операция с линейным временем выполнения O(n).
  • Советы для оптимизации в Unity:
    *   Если известно приблизительное количество элементов заранее, задавайте начальную емкость через конструктор `new List<int>(1000)`. Это минимизирует операции расширения.
    *   При частых добавлениях/удалениях в середину списка рассмотрите использование других структур данных, таких как `LinkedList<T>`, хотя для большинства задач в Unity `List<T>` оптимален.
    *   Для интенсивных операций в **циклах Update/FixedUpdate** старайтесь минимизировать изменения размера списка. Например, используйте пулы объектов (`Object Pooling`).

Пример использования в Unity

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

using UnityEngine;
using System.Collections.Generic;

public class EnemyManager : MonoBehaviour
{
    private List<Enemy> activeEnemies = new List<Enemy>();

    // Динамическое добавление врага
    public void SpawnEnemy(Enemy enemyPrefab)
    {
        Enemy newEnemy = Instantiate(enemyPrefab);
        activeEnemies.Add(newEnemy); // Список расширяется динамически
    }

    // Динамическое удаление врага (например, при смерти)
    public void OnEnemyDeath(Enemy deadEnemy)
    {
        if (activeEnemies.Remove(deadEnemy))
        {
            Destroy(deadEnemy.gameObject); // Удаляем из списка и уничтожаем GameObject
        }
    }

    // Динамическое изменение состояния всех врагов
    public void SetAllEnemiesToAlertMode()
    {
        for (int i = 0; i < activeEnemies.Count; i++)
        {
            activeEnemies[i].SetAlertMode(true); // Изменяем каждый элемент
        }
    }
}

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