Как разделить список на группы и сохранить индексы? - PullRequest
1 голос
/ 08 июля 2010

У меня есть список, который содержит, скажем, 6 значений. С помощью кнопок можно вставлять новые элементы в список. Я могу перемещать все эти элементы вверх и вниз с помощью других кнопок, которые я добавил. В целях понимания мы будем называть вновь созданные элементы (которые я хочу действовать как группы / разделители) "группами". То, чего я хочу достичь, - это хранить элементы между группами. Например, через SortedDictionary<int itemIndex, string group>. Пример (обратите внимание, что номер в скобках - это индекс):

Group 1 [0]
Item 1 [1]
Item 2 [2]
Item 3 [3]
Group 2 [4]
Item 4 [5]
Item 5 [6]
Group 3 [7]
Item 6 [8]

Словарь может выглядеть так:

1, "group 1"
2, "group 1"
3, "group 1"
5, "group 2"
6, "group 2"
8, "group 3"

Если первое число - это индекс элемента в списке, а второе (строка) - группа, к которой оно относится.

Итак, мой вопрос: как зациклить список таким образом, чтобы я мог проверить, какие элементы попадают в какую группу? Если есть более простой способ сделать это (используя другой элемент управления, чем список), я тоже буду рад попробовать.

Ответы [ 2 ]

1 голос
/ 08 июля 2010

Если вы имеете в виду winforms, ListView имеет встроенный .Groups (каждый из ListViewGroup), каждый ListViewItem имеет .Group. Это должно сделать то, что вам нужно, простым в коде и визуально интуитивно понятным для пользователя.

Обратите внимание, что группы отображаются только в том случае, если .View равно View.Details, .ShowGroups равно true и включено визуальное оформление (Application.EnableVisualStyles(), обычно в Main()).

0 голосов
/ 08 июля 2010

Мне удалось решить это самому, и вот как:

        // Create string to save last 'used' group in.
        string lastGroup = string.Empty;

        // Create counter to check what index we are at in the ListBox.
        int i = 0;

        // Create a dictionary to store <string Item, string Group>.
        Dictionary<string, string> dictionary = new Dictionary<string, string>(); 

        // Loop every item (as string) in the ListBox.
        foreach (string o in lbxMain.Items)
        {
            // If the item is a group:
            if (o.StartsWith("Group:"))
                // Put the name of the item into the lastGroup variable so we know where to put the items in.
                lastGroup = lbxMain.Items[i].ToString();

            // If the item is an item:
            if (o.StartsWith("Item:"))
                // Put the item into a dictionary with the lastGroup variable saying what group it's part of.
                dictionary .Add(o + " " + i, lastGroup);

            // Increase i so we keep an eye on the indices.
            i++;
        }

И если вы просто хотите код:

        string lastGroup = string.Empty;
        int i = 0;
        Dictionary<string, string> dictionary = new Dictionary<string, string>(); 

        foreach (string o in lbxMain.Items)
        {
            if (o.StartsWith("Group:"))
                lastGroup = lbxMain.Items[i].ToString();
            if (o.StartsWith("Item:"))
                dictionary.Add(o + " " + i, lastGroup);
            i++;
        }
...