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

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

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. Можно ли сделать индексатор динамическим?
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 4
@majstar_Zubr
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
Fullstack dev
Такое ощущение, что вам нужен Dictionary<int, Person>, вместо массива, тогда не нужно будет динамически расширять массив, когда это надо (и не будет создаваться лишнее пустое место, если вы захотите пропустить пару сотен элементов)
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
ПРОФЭЛИТ Казань
от 100 000 до 170 000 ₽
Mystery Tag Новосибирск
от 80 000 до 110 000 ₽
GD Company Санкт-Петербург
от 120 000 до 150 000 ₽
02 апр. 2020, в 21:27
600 руб./за проект
02 апр. 2020, в 21:15
3000 руб./за проект
02 апр. 2020, в 21:11
8500 руб./за проект