Лучший отвечающий
Linq оптимизация поиска

Вопрос
-
Здравствуйте
У меня проблема с поиском (LINQ). Внизу код - так он ищет из списка и находит
индексы.public List<int> GetIndexes(string searchFor) { //1/07 int i; Indexes.Clear(); if (searchFor == "" || searchFor == null) { for (i = 0; i < DataList.Count; i++) { Indexes.Add(new int()); Indexes[i] = i; } return Indexes; } var ResultFromSearch = from n in DataList where n.dFirstName.ToLower().Contains(searchFor.ToLower()) || n.dLastName.ToLower().Contains(searchFor.ToLower()) select n; i = 0; foreach (var dd in ResultFromSearch) { Indexes.Add(new int()); Indexes[i] = DataList.IndexOf(dd); i++; } return Indexes; }
Потом он таким образом рисует их.
А поиск начинается событием TextBox_TextChangedvoid InitDialog() { int sec = -154; //ListPL это коллекция моего инструмента (типа List) и я думою здесь очевидно что происходит for (int i = 0; i < reData.Indexes.Count; i++ ) { listPL.Add(new ProfileList.ProfileList()); listPL[i].pictureBox1.Image = reData.DataList[reData.Indexes[i]].dImage; listPL[i].labelName.Text = reData.DataList[reData.Indexes[i]].dFirstName; listPL[i].labelID.Text = i.ToString(); listPL[i].InitLabels(); listPL[i].labelLastName.Text = reData.DataList[reData.Indexes[i]].dLastName; listPL[i].Location = new Point( 0, sec += 154 ); listPL[i].Size = new Size(400, 150); listPL[i].buttonDel.MouseClick -= new MouseEventHandler(Delete); listPL[i].buttonDel.MouseClick += new MouseEventHandler(Delete); listPL[i].labelAge.Text = reData.DataList[reData.Indexes[i]].dAge.ToString(); panelForList.Controls.Add(listPL[i]); } }
и делает следующее
reData.GetIndexes(textSearch.Text); //Реализация этой функции написан выше (первый) InitDialog();//а это второй код
Если ListPL всего 2 или 3 поиск еще нормально работает , но больше 4 уже медлит ужасно , и поиск, и вообще медленно печатается . Вся программа работает в одном потоке. У кого какие идеи пожалуйста скажите если кто не уверен в ответе все ровно пишите буду экспериментировать.
СПАСИБО.
- Перемещено Abolmasov Dmitry 28 декабря 2011 г. 14:43 (От:Настольные ПК)
11 ноября 2011 г. 10:57
Ответы
-
public IEnumerable<int> GetIndexes(string searchFor) { searchFor = searchFor.ToLower(); if (searchFor == "" || searchFor == null) for (int i = 0; i < DataList.Count; i++) yield return i; else for (int i = 0; i < DataList.Count; i++) if (DataList[i].dFirstName.ToLower().Contains(searchFor) || DataList[i].dLastName.ToLower().Contains(searchFor)) yield return i; } void InitDialog(string searchFor) { int sec = -154; foreach (int i in GetIndexes(searchFor)) { var obj = reData.DataList[i]; var label = new ProfileList.ProfileList(); label.pictureBox1.Image = obj.dImage; label.labelName.Text = obj.dFirstName; label.labelID.Text = i.ToString(); label.InitLabels(); label.labelLastName.Text = obj.dLastName; label.Location = new Point(0, sec += 154); label.Size = new Size(400, 150); label.buttonDel.MouseClick -= new MouseEventHandler(Delete);//wtf ? label.buttonDel.MouseClick += new MouseEventHandler(Delete); label.labelAge.Text = obj.dAge.ToString(); panelForList.Controls.Add(label); } }
11 ноября 2011 г. 15:16
Все ответы
-
public IEnumerable<int> GetIndexes(string searchFor) { searchFor = searchFor.ToLower(); if (searchFor == "" || searchFor == null) for (int i = 0; i < DataList.Count; i++) yield return i; else for (int i = 0; i < DataList.Count; i++) if (DataList[i].dFirstName.ToLower().Contains(searchFor) || DataList[i].dLastName.ToLower().Contains(searchFor)) yield return i; } void InitDialog(string searchFor) { int sec = -154; foreach (int i in GetIndexes(searchFor)) { var obj = reData.DataList[i]; var label = new ProfileList.ProfileList(); label.pictureBox1.Image = obj.dImage; label.labelName.Text = obj.dFirstName; label.labelID.Text = i.ToString(); label.InitLabels(); label.labelLastName.Text = obj.dLastName; label.Location = new Point(0, sec += 154); label.Size = new Size(400, 150); label.buttonDel.MouseClick -= new MouseEventHandler(Delete);//wtf ? label.buttonDel.MouseClick += new MouseEventHandler(Delete); label.labelAge.Text = obj.dAge.ToString(); panelForList.Controls.Add(label); } }
11 ноября 2011 г. 15:16 -
Спасибо но что то не очень помог чуть видно разницы но все ровно буквы пишет
скоростью 1char/2sec. Я думою загрузить все в List<string> потом так быстрее будет искать что скажите ???
А это
label.buttonDel.MouseClick -= new MouseEventHandler(Delete);//wtf ?
затем что без этого у меня все сразу удаляется если нажимаю на первый контроль ,
а если начинаю с последнего, то потом когда я нажимаю на следующий контроль он говорит что "index out of range" столько раз сколько раз я удалял прежде ~.
Да и кстати мой компьютер:
Win 7, Core 2 Duo E4600 , 2 GB RAM ... и он не медлит.11 ноября 2011 г. 17:03 -
Спасибо но что то не очень помог
Ну я просто причесал ваш метод, алгоритм тот же.
буквы пишет
скоростью 1char/2secКакие буквы? В текстбоксе поиска что ли? Так может не нужно вешать на TextChanged, а сделать поиск по нажатию на кнопку?
А сколько элементов в DataList ?
11 ноября 2011 г. 19:36 -
а сделать поиск по нажатию на кнопку?
А сколько элементов в DataList ?
Вы имейте в виду что бы он работал по нажатии Button или в событии KeyPress .
Второй не помог, а Button это мой последний вариант.Сейчас 5 элементов. А вообще должно быть более 1000.
Я думою загрузить все в List<string> потом так быстрее будет искать ЧТО СКАЖИТЕ???
СПАСИБО ЧТО ПОМОГАЙТЕ.12 ноября 2011 г. 11:12 -
Я не представляю себе, что может тормозить на пяти элементах списка. И из того кода который вы привели, нельзя понять что-же тормозит. Приведите полный код приложения, либо выясните где именно происходит тормоза.
12 ноября 2011 г. 20:30 -
Полный код написать здесь не получится. Но если вам интересно напишите ваш Mail
я отправлю на ваш e-mail весь проект, просто не хочу зря тратить ваше время.
Спасибо.12 ноября 2011 г. 21:41 -
Полный код написать здесь не получится. Но если вам интересно напишите ваш Mail
я отправлю на ваш e-mail весь проект, просто не хочу зря тратить ваше время.
Спасибо.Нет, уж, спасибо :0) Ваша задача, как разработчика, есть умение выявлять или хотя бы локализовать ошибки вашего же приложения.
Я вам советую созать новый проект, скопировать в него минимум кода, который демонстрирует проблемы поиска, без реализации не относящихся к делу вещей, и проанализировать что же именно тормозит. Как правило, после такой манипуляции, ошибки обнаруживаются сами собой. Если же этот демо-пример тоже будет тормозить, и вы не сможете определить причину, тогда уже выложите его на форуме.
12 ноября 2011 г. 22:00 -
Нет, уж, спасибо :0) Ваша задача, как разработчика, есть умение выявлять или хотя бы локализовать ошибки вашего же приложения.
Учитывая что это "самоучка", я думою, что просить о помощи в таком ситуации не позор. Но все равно я понимаю что в MSDN помогают, а не учат или мастер классы дают. Так что за сделанное вам огромное спасибо и если можно дайте ссылку где можно читать про такие проблемы.
Спасибо.12 ноября 2011 г. 22:53