Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Удаление повторяющихся item'ов listbox'a


Автор: derek 22.12.2006, 11:06
Допустим есть listbox с такими item'ами
1
2
3
3
3
5
3
6

на выходе должны получить
1
2
3
5
6

ну не обязательно в таком порядке, просто нужно чтобы 3-ка осталось одна...
как сделать?

спасибо

Автор: mr.DUDA 22.12.2006, 11:11
Загнать итемы в Dictionary, очистить листбокс, вернуть из dictionary.Keys в листбокс.

Автор: ivashkanet 22.12.2006, 11:33
Полу  smile 
Хотел так:
Цитата
Наследуешься от ListBox и от ObjectCollection.
В ListBox переопределяешь свойство Items чтобы оно возвращало твою ObjectCollection.

В твоей ObjectCollection переопределяешь методы Add и AddRange



Вот только засада, они не виртуальные  smile  smile  smile  smile  smile
Странно  smile 

Автор: derek 22.12.2006, 11:50
ладно ок. теперь такой вопрос. Как удалить повторяющиеся элменты Dictionary?

Автор: ivashkanet 22.12.2006, 11:57
Цитата(derek @  22.12.2006,  10:50 Найти цитируемый пост)
Как удалить повторяющиеся элменты Dictionary? 

В том то и прикол, что их не может быть smile
Каждый итем у Dictionary уникален  smile 

Автор: DarkDragon 22.12.2006, 16:03
Алгоритм:
Код

        private void ClearDoubleItems(ListBox lb)
        {
            string temp1 = null;
            string temp2 = null;
            int max = lb.Items.Count - 1;
            int maxtemp = lb.Items.Count - 1;
            for (int p = 0; p <= maxtemp; p++)
            for (int i = 0; i <= max; i++)
            {
                temp1 = Convert.ToString(lb.Items[i]);
                if (i != lb.Items.Count - 1)
                for (int l = i+1; l <= max; l++)
                {
                    temp2 = Convert.ToString(lb.Items[l]);
                    if (string.Compare(temp1, temp2) == 0)
                    {
                        lb.Items.RemoveAt(l);
                        max--;
                    }
                }
            }
        }


Автор: derek 27.12.2006, 09:16
народ, я вас уже достал наверное но никак не могу понять философию listbox'a. Точнее у меня проблема с организацией цикла.  smile 
есть 2 листбокса
первый с item'ами - 1 2 3
второс такими - 3 4 5

нужно сформировать 3 список с такими item'ами - которые входят в первый список + они не входят во второй. т.е. 3-й список должен содержать значения 1 и 2...

пробую так

Код

 for (int i = 0; i <= 10; i++)
                {

                    for (int j = 0; j <= 10; j++)
                    {

                        if ((int)L1.Items[i] != (int)L2.Items[j])
                        {
                            L3.Items.Add(L1.Items[i]);

                        }

                    }

                }


но так он работает не правильно, в L3 попадают значения которых там не должно быть, что впринципе логично, ведь я сравниваю значения поочередно...как сделать правильно

*создание дополнительных  списков (listbox'ов) возможно, но не желательно. Но если без дополнительного листбокса получится слишком сложно, то тогда пофигу - мне впринципе главное сделать максимально просто...


Автор: mr.DUDA 27.12.2006, 10:15
Цитата(derek @  27.12.2006,  08:16 Найти цитируемый пост)
но никак не могу понять философию listbox'a

Вот это и видно. Визуальный контрол вы используете для организации и обработки данных, то же самое что забивать гвозди микроскопом.

Автор: derek 4.1.2007, 14:23
mr.DUDA, ну хорошо. напишите хотя бы алгоритм. 
с нынешнего момента буду листбоксы юзать для вывода данных. 

Автор: mr.DUDA 4.1.2007, 17:40
Если делать по простому, то так:
Код
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> firstList = new List<int>();
        List<int> secondList = new List<int>();

        // заполнение списков (можно взять хоть из ListBox, хоть откуда угодно)
        firstList.Add(1);
        firstList.Add(2);
        firstList.Add(3);
        secondList.Add(3);
        secondList.Add(4);
        secondList.Add(5);

        // добавляем числа, не входящие в два списка сразу
        List<int> resultList = new List<int>();
        foreach (int x in firstList)
        {
            if (!secondList.Contains(x))
                resultList.Add(x);
        }
        foreach (int x in secondList)
        {
            if (!firstList.Contains(x))
                resultList.Add(x);
        }

        // посмотрим, что получилось
        foreach (int x in resultList)
            Console.WriteLine(x);
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)