Возможна ли коллекция коллекций и / или лучший способ? C # .Net 3.5 - PullRequest
3 голосов
/ 27 октября 2008

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

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

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

Ответы [ 5 ]

8 голосов
/ 27 октября 2008
List< List<Placement>> ListofListOfPlacements = new List< List<Placement>> ();

List<Placement> dashboard1 = new List<Placement>();
List<Placement> dashboard2 = new List<Placement>();
List<Placement> dashboard3 = new List<Placement>();
List<Placement> dashboard4 = new List<Placement>();

ListofListOfPlacements.Add(dashboard1);
ListofListOfPlacements.Add(dashboard2);
ListofListOfPlacements.Add(dashboard3);
ListofListOfPlacements.Add(dashboard4);
1 голос
/ 27 октября 2008

Поскольку вы говорите о вкладках, мне кажется, что вы хотите что-то ближе к словарю, указанному в имени вкладки, с набором элементов для каждой вкладки. В .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.

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

1 голос
/ 27 октября 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());
1 голос
/ 27 октября 2008

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

0 голосов
/ 16 марта 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...