Обращение к объекту во вложенном классе

Есть класс "Панель". Каждая панель имеет набор ярлыков, которые описываются отдельным классом. Мне нужно обращаться к каждому отдельному ярлыку конкретной панели. Как получить имя конкретного ярлыка (что-то вроде Panels[0].Shortcuts[1] Name)? Не понимаю, что делаю не так..

 class Panel
        {
            public  string Name { get; set; }
            public Keys HKkey1 { get; set; }
            public Keys HKkey2 { get; set; }
            public Keys HKkey3 { get; set; }
            public Panel(string name)
            {
                Name = name; 
            }

            public class Shortcut
            {
                public string Name { get; set; }
                public string Parth { get; set; }
                public Icon imageShcut = new Icon();
            }
        }
        List<Panel> Panels = new List<Panel>(10);
        List<Panel.Shortcut> Shortcuts = new List<Panel.Shortcut>(15);

       textbox1.text = Panels[2].Shortcuts[1].Name //Так не работает
       textbox1.text = Shortcuts[0].Name //Работает так, но это не то, что мне нужно

Ответы (1 шт):

Автор решения: aepot

Вы просто запутались, распутывайтесь

class Panel
{
    public string Name { get; set; }
    public Keys HKkey1 { get; set; }
    public Keys HKkey2 { get; set; }
    public Keys HKkey3 { get; set; }
    public List<Shortcut> Shortcuts { get; set; } // список там, куда обращаетесь

    public Panel(string name)
    {
        Name = name; 
    }
}

// класс объявляется отдельно
public class Shortcut
{
    public string Name { get; set; }
    public string Path { get; set; }
    public Icon Icon { get; set; } = new Icon();
}
List<Panel> panels = new List<Panel>();
Panel panel = new Panel("test");
panels.Add(panel);

panel.Shortcuts = new List<Shortcut>();
Shortcut shortcut = new Shortcut()
shortcut.Name = "test shortcut";
panel.Shortcuts.Add(shortcut);
textBox1.Text = panels[0].Shortcuts[0].Name; // "test shortcut"

Ещё вот здесь List<Panel>(10) вы наверное думаете, что задаете емкость списка, но это не так. На самом деле это базовая емкость списка и на добавление элементов она не влияет, по умолчанию она 16, но список сам увеличивает своё внутреннее хранилище, если закончилось место. Другими словами, не используйте это для списков до тех пор, пока не поймёте, зачем оно надо. А надо оно для улучшения производительности в особых случаях. В вашем случае оно не надо.

List<Panel> panels = new List<Panel>(12345);
textBox1.Text = panels.Count.ToString(); // 0
panels.Add(new Panel("test"));
textBox1.Text = panels.Count.ToString(); // 1
panels.RemoveAt(0);
textBox1.Text = panels.Count.ToString(); // 0

Вот так это работет.

Список логически от массива тем и отличается, что когда знаете точное кличество элементов, вы создаете массив. Когда не знаете - список. Ну и плюс в список можно в любой момент добавлять и удалять элементы, а модифицировать состав элементов массива нельзя.

Если список такой удобный и гибкий, почему разработчики используют массивы до сих пор? А потому что массив легче и быстрее по производительности.

→ Ссылка