Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.54/54: Рейтинг темы: голосов - 54, средняя оценка - 4.54
Тов. Эдуард
4 / 4 / 1
Регистрация: 20.11.2010
Сообщений: 211
1
.NET 4.x

Поиск по списку

26.06.2011, 19:16. Просмотров 10828. Ответов 22
Метки нет (Все метки)

Всем привет!
У меня есть список(list box), можно ли организовать поиск в реальном времени, и так чтоб ненужные item'ы убирались? (про массивы я знаю)
Спасибо
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2011, 19:16
Ответы с готовыми решениями:

Поиск по списку
Здрям! тут построчно список каталогов: C:\Temp\List.txt Надо брать каждую строку и...

Поиск по списку
Тут такой вопрос. Вот код на просмотр созданного списка.. Список односвязный. А как мне осуществить...

ВПР Поиск из по списку
Здравствуйте. Данные о компаниях из столбцов "Покупатель", "Поставщик" необходимо упростить . Есть...

поиск по списку имен
сегодня неренесли все базы лотуса на другую машину. вроде всё работает кроме поиска по списку...

22
umnick_kh
308 / 246 / 44
Регистрация: 06.12.2010
Сообщений: 527
26.06.2011, 19:19 2
Что значит поиск в реальном времени?
Так все таки,список или ListBox?
0
Тов. Эдуард
4 / 4 / 1
Регистрация: 20.11.2010
Сообщений: 211
26.06.2011, 20:28  [ТС] 3
Во первых я всегда думал что ListBox - это список. Во вторых, в реальном времени - это когда вы набираете искомое слово, то в низу уже высвечиваются варианты, т.е не надо нажимать на кнопочку "поиск". Можно ли сделать так, чтоб в листбоксе убирались ненужные результаты, в которых нет искомой комбинации?
0
umnick_kh
308 / 246 / 44
Регистрация: 06.12.2010
Сообщений: 527
26.06.2011, 23:58 4
Цитата Сообщение от Тов. Эдуард Посмотреть сообщение
я всегда думал что ListBox - это список.
Я понял буквально,и принял за List<T>
Сейчас попробую своять чего-нибудь с поиском.

Добавлено через 1 час 52 минуты
Вот,просидел полтора часа,но справился
Ищет конечно с помарками,но все таки ищет.С ненужными результатами уже сами,т.к свободного времени у меня мало.Может быть кто-то другой доделает.
Код не оптимизирован,с пылу с жару,как говорится,так что тапками не кидайте.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System;
using System.Collections.Generic;
using System.Windows.Forms;
//Автор: Umnick
namespace ListBoxSearch
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// Метод,позволяющий организовать поиск в listBox.
        /// Автор: Umnick
        /// </summary>
        /// <param name="listBox">ListBox в котором осуществляется поиск.</param>
        public void Search(ListBox listBox)
        {
            //Объявление переменных и заполнение их для поиска
            List<int> c = new List<int>();    //Колличество совпадений
            int n = 0; //Сюда запишем наибольшее кол-во совпадений
            int index = 0; //Сюда запишем индекс элемента в listbox,в котором найдено наибольшее кол-во совпадений
            List<string> s = new List<string>();//будем переписывать все items из listbox сюда
            for (int i = 0; i < listBox1.Items.Count; i++)  //цикл,в нем заполним наши списки
            {
                s.Add(listBox.Items[i].ToString());//заполняем items
                c.Add(0);//заполняем наш счетчик нулями
            }
            //Основные циклы по работке с поиском
            for (int i = 0; i < textBox1.Text.Length; i++)//Цикл,им проходимся по каждому символу в строке поиска
            {
                for (int j = 0; j < s.Count; j++)//Цикл,проходимся по каждому item в нашей коллекции,ранее мы переписали туда все items
                {
                    for (int k = 0; k < s[j].Length; k++)//Цикл,посимвольно перебираем значение каждого items и ищем совпадения.
                    {
                        if (s[j][k] == textBox1.Text[i])//Проверка на совпадение.Если один из символов items`а совпал с одним из символов строки поиска,увеличиваем наш счетчик
                        {
                            c[j] = ++c[j];//Увеличиваем счетчик,каждый индекс которого,соответствует каждому items в listBox1.
                        }
                    }
                    if (c[j] > n)//Поиск найбольшего счетчика,тоесть items,в котором было обнаружено наибольшее кол-во совпадений.
                    {
                        n = c[j];//...
                        index = j;//Записываем в переменную,индекс,как и говорилось ранее.
                    }
                }
            }
            if (n > 2)//Если совпадений больше двух(глупо конечно,но все таки),то:
            {
                listBox1.SetSelected(index, true);//Выделяем найденный индекс.
            }
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            Search(listBox1);//Вызываем наш метод,и начинаем поиск.
        }
    }
}
4
CLEO_ROCK
70 / 70 / 23
Регистрация: 22.05.2011
Сообщений: 528
27.06.2011, 00:30 5
а не проще так:
C#
1
2
3
4
5
6
7
8
9
10
11
private void textBox1_TextChanged(object sender, EventArgs e)
        {
           
            for(int i=0;i<this.listBox1 .Items.Count;i++)
                if (!this.listBox1.Items[i].ToString().Contains(this.textBox1.Text))
                {
                     
                    this.listBox1.Items.RemoveAt(i);
                    i--;
                }
        }
1
umnick_kh
308 / 246 / 44
Регистрация: 06.12.2010
Сообщений: 527
27.06.2011, 00:35 6
CLEO_ROCK, может конечно и проще,но я бы не сказал,что лучше.Ваш вариант удалит все item из listBox,если введена строка,но не было найдено ни одного совпадения.И зачем там эти строчки?
C#
1
2
3
            int[] todel = new int[this.listBox1.Items.Count];
            int delInd = 0;
            todel[delInd] = i;
1
CLEO_ROCK
70 / 70 / 23
Регистрация: 22.05.2011
Сообщений: 528
27.06.2011, 00:37 7
ну насчет строчек, то их я передумал использовать, а насчет удаления
Цитата Сообщение от Тов. Эдуард Посмотреть сообщение
Можно ли сделать так, чтоб в листбоксе убирались ненужные результаты
0
umnick_kh
308 / 246 / 44
Регистрация: 06.12.2010
Сообщений: 527
27.06.2011, 00:55 8
Цитата Сообщение от umnick_kh Посмотреть сообщение
удалит все item из listBox
в этом подразумевалось то,что эти item уже не вернутся
Ну,а вообще,спорить на эту тему можно долго.Т.к поиск бывает разный - до полного совпадения,частичное совпадение и т.п,а ТС не уточнил,какой поиск ему нужен,и каждый трактовал это по-своему.
0
CLEO_ROCK
70 / 70 / 23
Регистрация: 22.05.2011
Сообщений: 528
27.06.2011, 01:07 9
поддержываю))
0
Ice_and_Fire
485 / 297 / 36
Регистрация: 22.06.2011
Сообщений: 929
27.06.2011, 10:16 10
Ну и на будущее ,что бы пол топика не выясняли что имеется ввиду, называется это "инкрементный поиск"
0
umnick_kh
308 / 246 / 44
Регистрация: 06.12.2010
Сообщений: 527
27.06.2011, 15:35 11
ТС,тема еще актуальна?
Чуть поправил код,поиск теперь работает точнее.

Код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
using System.Collections.Generic;
using System.Windows.Forms;
//Автор: Umnick
namespace ListBoxSearch
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// Метод,позволяющий организовать поиск в listBox.
        /// Автор: Umnick
        /// </summary>
        /// <param name="listBox">ListBox в котором осуществляется поиск.</param>
        public void Search(ListBox listBox)
        {
            //Объявление переменных и заполнение их для поиска
            List<int> c = new List<int>();    //Колличество совпадений
            int n = 0; //Сюда запишем наибольшее кол-во совпадений
            int index = 0; //Сюда запишем индекс элемента в listbox,в котором найдено наибольшее кол-во совпадений
            List<string> s = new List<string>();//будем переписывать все items из listbox сюда
            for (int i = 0; i < listBox1.Items.Count; i++)  //цикл,в нем заполним наши списки
            {
                s.Add(listBox.Items[i].ToString());//заполняем items
                c.Add(0);//заполняем наш счетчик нулями
            }
            //Основные циклы по работке с поиском
            for (int i = 0; i < textBox1.Text.Length; i++)//Цикл,им проходимся по каждому символу в строке поиска
            {
                for (int j = 0; j < s.Count; j++)//Цикл,проходимся по каждому item в нашей коллекции,ранее мы переписали туда все items
                {
                    for (int k = 0; k < s[j].Length; k++)//Цикл,посимвольно перебираем значение каждого items и ищем совпадения.
                    {
                        if (s[j][k] == textBox1.Text[i] || char.ToLower(s[j][k]) == textBox1.Text[i] || char.ToUpper(s[j][k]) == textBox1.Text[i])//Проверка на совпадение.Если один из символов items`а совпал с одним из символов строки поиска,увеличиваем наш счетчик
                        {
                            c[j] = ++c[j];//Увеличиваем счетчик,каждый индекс которого,соответствует каждому items в listBox1.
                        }
                        else if (s[j][0] != textBox1.Text[0])//Если первый символ строки поиска не совпадает с первым сивмолом item`а,обрываем текущую итерацию цикла
                        {
                            break;//обрываем
                        }
                        else if (textBox1.Text.Length > 1)//Просто проверка,что бы не было исключений
                        {
                            if (s[j][1] != textBox1.Text[1])//Собственно тоже самое,что и проверка на совпадение первых символов,только для вторых
                            {
                                break;//обрываем
                            }
                        }
                    }
                    if (c[j] > n)//Поиск найбольшего счетчика,тоесть items,в котором было обнаружено наибольшее кол-во совпадений.
                    {
                        n = c[j];//...
                        index = j;//Записываем в переменную,индекс,как и говорилось ранее.
                    }
                }
            }
                listBox1.SetSelected(index, true);//Выделяем найденный индекс.
        }
 
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
         Search(listBox1);//Вызываем наш метод,и начинаем поиск.
        }
    }
}
2
Тов. Эдуард
4 / 4 / 1
Регистрация: 20.11.2010
Сообщений: 211
27.06.2011, 16:57  [ТС] 12
Кстати, можно ли использовать этот код в wpf?
0
umnick_kh
308 / 246 / 44
Регистрация: 06.12.2010
Сообщений: 527
27.06.2011, 16:59 13
Можно конечно,чего ж нельзя-то
Тут же вроде бы,из WinForms только названия контролов,остальное чистая логика.
1
Тов. Эдуард
4 / 4 / 1
Регистрация: 20.11.2010
Сообщений: 211
27.06.2011, 18:21  [ТС] 14
Просто в WPF несколько иная структура. каждый item имеет имя. Как в это случае организовать поиск?
спасибо
0
umnick_kh
308 / 246 / 44
Регистрация: 06.12.2010
Сообщений: 527
27.06.2011, 18:35 15
Я с Wpf не работал,но думаю там к item`ам можно так же обращаться по индексам,так что должно работать.
1
Тов. Эдуард
4 / 4 / 1
Регистрация: 20.11.2010
Сообщений: 211
27.06.2011, 18:41  [ТС] 16
В WPF работает, ура товарищи!
CLEO_ROCK, мне ваш метод интересен, тем что результаты убираются. как сделать так, чтоб они исчезали на время поиска, то есть пользователь нашел, теперь стирает строку поиска, как восстановить список?
Спасибо)))
0
umnick_kh
308 / 246 / 44
Регистрация: 06.12.2010
Сообщений: 527
27.06.2011, 20:34 17
Теперь мой код тоже скрывает элементы,которые не соответствуют строке поиска,а потом их возвращает.Конечно этот метод еще дорабатывать и дорабатывать,но всему свое время)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
using System;
using System.Collections.Generic;
using System.Windows.Forms;
//Автор: Umnick
namespace ListBoxSearch
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// Метод,позволяющий организовать поиск в listBox.
        /// Автор: Umnick
        /// </summary>
        /// <param name="listBox">ListBox в котором осуществляется поиск.</param>
        public void Search(ListBox listBox, List<string> q)
        {
            //Объявление переменных и заполнение их для поиска
            bool flag = false;
            List<int> c = new List<int>();    //Колличество совпадений
            List<string> match = new List<string>();//Список с совпадениями
            int n = 0; //Сюда запишем наибольшее кол-во совпадений
            double p = 0;
            int count = 0;
            int index = 0; //Сюда запишем индекс элемента в listbox,в котором найдено наибольшее кол-во совпадений
            List<string> s = new List<string>();//будем переписывать все items из listbox сюда
            for (int i = 0; i < listBox1.Items.Count; i++)  //цикл,в нем заполним наши списки
            {
                s.Add(listBox.Items[i].ToString());//заполняем items
                c.Add(0);//заполняем наш счетчик нулями
            }
            //Основные циклы по работке с поиском
            for (int i = 0; i < textBox1.Text.Length; i++)//Цикл,им проходимся по каждому символу в строке поиска
            {
                for (int j = 0; j < s.Count; j++)//Цикл,проходимся по каждому item в нашей коллекции,ранее мы переписали туда все items
                {
                    for (int k = 0; k < s[j].Length; k++)//Цикл,посимвольно перебираем значение каждого items и ищем совпадения.
                    {
                        if (s[j][k] == textBox1.Text[i] || char.ToLower(s[j][k]) == textBox1.Text[i] || char.ToUpper(s[j][k]) == textBox1.Text[i])//Проверка на совпадение.Если один из символов items`а совпал с одним из символов строки поиска,увеличиваем наш счетчик
                        {
                            c[j] = ++c[j];//Увеличиваем счетчик,каждый индекс которого,соответствует каждому items в listBox1.
                            count++;
                            flag = true;
                        }
                        else if (s[j][0] != textBox1.Text[0])//Если первый символ строки поиска не совпадает с первым сивмолом item`а,обрываем текущую итерацию цикла
                        {
                            break;//обрываем
                       }
                        else if (textBox1.Text.Length > 2 && s[j].Length > 2)//Просто проверка,что бы не было исключений
                        {
                            if (s[j][1] != textBox1.Text[1])//Собственно тоже самое,что и проверка на совпадение первых символов,только для вторых
                            {
                                break;//обрываем
                            }
                        }
                    }
                    if (c[j] > n)//Поиск найбольшего счетчика,тоесть items,в котором было обнаружено наибольшее кол-во совпадений.
                    {
                        n = c[j];//...
                        index = j;//Записываем в переменную,индекс,как и говорилось ранее.
                    }
                }
            }
            if (flag)
            {
                listBox.Items.Clear();
                for (int i = 0; i < c.Count; i++)
                {
                    p += c[i];
                }
                p /= c.Count;
                for (int i = 0; i < s.Count; i++)
                {
                    if (c[i] > p)
                    {
                        listBox.Items.Add(s[i]);
                    }
                }
            }
            if (!flag) 
            {
                listBox.Items.Clear();
                for (int i = 0; i < q.Count; i++)
                {
                    listBox.Items.Add(q[i]);
                }
            }
            flag = false;
       }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
         Search(listBox1,items);//Вызываем наш метод,и начинаем поиск.
        }
        public List<string> items = new List<string>();
        private void Form1_Load(object sender, EventArgs e)
        {
            for (int i = 0; i < listBox1.Items.Count; i++)
            {
                items.Add(listBox1.Items[i].ToString());
            }
        }
    }
}
1
Тов. Эдуард
4 / 4 / 1
Регистрация: 20.11.2010
Сообщений: 211
27.06.2011, 21:32  [ТС] 18
umnick_kh, спасибо Вам за труд
0
umnick_kh
308 / 246 / 44
Регистрация: 06.12.2010
Сообщений: 527
27.06.2011, 21:37 19
Цитата Сообщение от Тов. Эдуард Посмотреть сообщение
umnick_kh, спасибо Вам за труд
Да не за что,мне и самому было интересно сделать,так сказать,сам себе вызов бросил
Я новые участки кода не комментировал,так что если что-то не понятно,спрашивайте.
0
CLEO_ROCK
70 / 70 / 23
Регистрация: 22.05.2011
Сообщений: 528
27.06.2011, 21:43 20
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public List<string> list = new List<string>();
private void Form1_Load(object sender, EventArgs e)
{
 for (int i = 0; i < listBox1.Items.Count; i++)
            {
               list.Add(listBox1.Items[i].ToString());
            }
}
private void textBox1_TextChanged(object sender, EventArgs e)
        {
           if(this.textBox1.Text.Length>0)
           {
            for(int i=0;i<this.listBox1 .Items.Count;i++)
                if (!this.listBox1.Items[i].ToString().Contains(this.textBox1.Text))
                {
                     
                    this.listBox1.Items.RemoveAt(i);
                    i--;
                }
           }
           else
              {
                 this.listBox1.Items.Clear();
                 for (int i = 0; i < list.Count; i++)
                      this.listBox1.Items.Add(list[i]);
              }
        }
1
27.06.2011, 21:43
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2011, 21:43

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

Поиск по вложенному списку
Здравствуйте. Описание: Столкнулся с необходимостью проверки введенного значения на...

Поиск по списку li. - Меню
Доброго времени суток. Не подскажете как организовать поиск - найти 1й &lt;li&gt; оставить его на...

Поиск по списку (list)
Привет) К примеру есть участок кода void PoiskDolg(list&lt;Book&gt; &amp;listBooks, list&lt;libray&gt;...

Поиск по списку! WinForm
Подскажите пожадуйста на с# часть кода.нажимая кнопку ...открываеться новое окно, а теперь сам...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.