@Anther
Начинающий

Можно ли сделать индексаторы динамической длиный?

using System;                                                                  // 1
using System.Collections.Generic;                                  // 2

namespace test_for_fun
{                                                                                      
    class Program                                                                          
    {                                                                                   
        static void Main()
        {
            People people = new People();
            people[0] = new Person { Name = "Tom" };
            people[1] = new Person { Name = "Bob" };
            people[2] = new Person { Name = "Jon" };
        }
    }

    class Person
    {
        public string Name { get; set; }
    }
    class People
    {
        Person[] data;
        public People()
        {
            data = new Person[2];
        }
       
        public Person this[int index]
        {
            get
            {
                return data[index];
            }
            set
            {
                if (data.Length < index)                 // 37
                {
                    //увеличить длину data
                }
                data[index] = value;                               
            }                                                       // 42
        }
    }

}


В программе описана два класса. Один шаблон для второго, а второй индексатор, хранящий ссылки на массив объектов. Я хочу сделать массив динамический, но как только я пишу эту строчку (people[2] = new Person { Name = "Jon" };), то в дебаге процесс сразу переходит на 42 строчку пропуская 37. Можно ли сделать индексатор динамическим?
  • Вопрос задан
  • 74 просмотра
Пригласить эксперта
Ответы на вопрос 4
@majstar_Zubr
C++, C#, gamedev
class People{
List<Person> data = new List<Person>();
...


+ обработка ошибок
Ответ написан
Комментировать
freeExec
@freeExec
Участник OpenStreetMap
но как только я пишу эту строчку (people[2] = new Person { Name = "Jon" };), то в дебаге процесс сразу переходит на 42 строчку пропуская 37.

Ну так правильно, сам же написал такое условие.
Длинна(2) < Индекса(2) - нет, нисколько она не меньше, в условия не заходим. Почему не смог это выяснить в дебаге мне не понятно.
Ответ написан
Комментировать
hePPer
@hePPer
public Person this[int index]
        {
            get { return data[index]; }
            set
            {
                if(data.Length <= index) // 37
                {
                    Array.Resize(ref data, index + 1);
                }

                data[index] = value;
            } // 42
        }
Ответ написан
Комментировать
vabka
@vabka Куратор тега C#
Токсичный шарпист
Такое ощущение, что вам нужен Dictionary<int, Person>, вместо массива, тогда не нужно будет динамически расширять массив, когда это надо (и не будет создаваться лишнее пустое место, если вы захотите пропустить пару сотен элементов)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы