Возможна ли коллекция коллекций и / или лучший способ? С# .Net 3.5

Я создал класс для элемента информационной панели, который будет содержать такую ​​информацию, как размещение на информационной панели, описание и т. д. В настоящее время я использую пару коллекций для хранения элементов информационной панели, содержащихся в «библиотеке», и элементов, отображаемых на информационной панели. сам. Меня попросили сделать эту панель с несколькими вкладками, и моим первым желанием было создать новую коллекцию для каждой вкладки. Для этого мне нужен какой-то тип массива или коллекции, в который можно было бы добавить многие из этих коллекций элементов панели инструментов, поскольку на панель инструментов добавляется больше вкладок.

Возможно ли это, и если да, могу ли я получить небольшой фрагмент кода для объявления такой коллекции? Я рассматривал возможность использования одной коллекции с переменной, чтобы показать, на какой вкладке будет отображаться элемент... Однако для отображения и подпрограмм для управления перемещением элементов панели мониторинга между экраном и библиотекой в ​​настоящее время требуются эти отдельные коллекции.

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


person Totty    schedule 27.10.2008    source источник


Ответы (5)


Поскольку вы говорите о вкладках, мне кажется, что вы хотите что-то более близкое к словарю, указанному в имени вкладки, с набором элементов на вкладке. В .NET 3.5 добавлен интерфейс ILookup<,>:

        ILookup<string, Foo> items = null; //TODO
        foreach (Foo foo in items["SomeTab"])
        {
            Console.WriteLine(foo.Bar);
        }

Обратите внимание, что реализация MS является неизменной — вы не можете редактировать ее после создания; однако я написал EditableLookup<,> в MiscUtil, который позволяет вам работать более эффективно ( как обычная коллекция .NET):

        var items = new EditableLookup<string, Foo>();
        items.Add("SomeTab", new Foo { Bar = "abc" });
        items.Add("AnotherTab", new Foo { Bar = "def" });
        items.Add("SomeTab", new Foo { Bar = "ghi" });
        foreach (Foo foo in items["SomeTab"])
        { // prints "abc" and "ghi"
            Console.WriteLine(foo.Bar);
        }

Без EditableLookup<,> вам нужно построить поиск с помощью метода расширения Enumerable.ToLookup.

Если какая-то часть этого звучит как вариант, я могу добавить больше деталей...

person Marc Gravell    schedule 27.10.2008

Почему бы не создать класс, содержащий вашу вторую коллекцию и всю предыдущую информацию, и просто иметь коллекцию этих элементов?

person Charles Graham    schedule 27.10.2008
comment
Я согласен. В какой-то момент вам, вероятно, понадобится больше информации о каждой вкладке, а не о том, какие объекты на ней находятся. - person Kibbee; 27.10.2008

почему бы не поместить свою коллекцию элементов приборной панели в класс вкладок?

вот так:

public class DashboardTabPage : TabPage
{
    public List<DashboardItem> DashboardItems { get; set; }

    public DashboardTabPage() : this (new List<DashboardItem>())
    {

    }

    public DashboardTabPage(List<DashboardItem> items) :base ("Dashboard Thing")
    {
        DashboardItems = items;
    }

}

открытый класс DashboardItem {}

то вы можете сделать это:

c.TabPages.Add(new DashboardTabPage());
person Hath    schedule 27.10.2008

Я думаю, вы должны пойти с композицией, как показано ниже

Домашний объект панели мониторинга для каждого пользователя (с несколькими вкладками), содержащий список объектов панели мониторинга, содержащий список объектов элементов панели мониторинга, для которых определены различные операции. Опять же, элемент информационной панели может быть пользовательским элементом управления, в котором определены все возможные события, которые обрабатываются либо в объекте элемента информационной панели, либо оставляются для объекта пользовательского интерфейса информационной панели, который будет работать с отдельными объектами информационной панели.

Я предполагаю, что это было бы лучше управляемо, если вы собираетесь следовать архитектуре на основе SOA и повторно используемых компонентов.

person Kunal S    schedule 16.03.2009

Вы также можете использовать такой кортеж: List<(string Father, IEnumerable<string> Children)>.

Пример:

var list = new List<(string Parent, IEnumerable<string> Children)>
{
   ("Bob", new[] { "Charlie", "Marie" }),
   ("Robert", new[] { "John", "Geoff", "Oliver" }),
};
person Shimmy Weitzhandler    schedule 08.08.2019