none
Linq оптимизация поиска RRS feed

  • Вопрос

  • Здравствуйте

     У меня проблема с поиском (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;
            }
    

    Потом он таким образом рисует их.
    void 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]);
                    
                }                    
            }
    
    А поиск начинается событием TextBox_TextChanged
    и делает следующее
    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);
                }
            }

    • Изменено Algol36 11 ноября 2011 г. 15:18
    • Помечено в качестве ответа SANOyan 13 ноября 2011 г. 19:46
    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);
                }
            }

    • Изменено Algol36 11 ноября 2011 г. 15:18
    • Помечено в качестве ответа SANOyan 13 ноября 2011 г. 19:46
    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) Ваша задача, как разработчика, есть умение выявлять или хотя бы локализовать ошибки вашего же приложения.
    Дело в том что я еще начинающий разработчик и года нет как я учусь   программировать "С++", а "С# и .NET" - 4 месяца, а это программа не работа, а цель.
    Учитывая что это "самоучка",  я думою, что просить о помощи в таком ситуации не позор. Но все равно я понимаю что в MSDN помогают, а не учат или мастер классы дают. Так что за сделанное вам огромное спасибо  и если можно дайте ссылку где можно читать про такие проблемы.
    Спасибо. 
    12 ноября 2011 г. 22:53