C# — Поиск элементов в большом списке

#c# #search #large-data #collect #autodesk-navisworks

Вопрос:

Всем привет,

Я разрабатываю плагин для Autodesk Navisworks: пользователь вводит в текстовые поля имя типа категории, тип свойства и ключевое слово, затем нажимает пользовательскую кнопку, которая выполняет поиск и собирает соответствующие элементы из дерева файлов.

Следующий код работает для «небольшого» дерева файлов (сотни элементов), но когда я запускаю поиск всего файла (содержащего тысячи элементов), программа зависает и использует всю доступную физическую память. Я хотел бы знать, как я мог бы улучшить свой код, чтобы он мог работать с большими файлами?

 using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Linq;
using Autodesk.Navisworks.Api;
using NavisworksApp = Autodesk.Navisworks.Api.Application;

namespace ClashPlugin.Ctr
{
    public partial class ClashPlugin : UserControl
    {
        public ClashPlugin()
        {
            InitializeComponent();
        }

        protected override void OnParentChanged(EventArgs e)
        {
            base.OnParentChanged(e);
            Dock = DockStyle.Fill;
        }

        private static string GetPropValue(DataProperty prop)
        {
            try
            {
                return prop.Value.IsDisplayString ? prop.Value.ToDisplayString() : prop.Value.ToString().Split(':')[1];
            }
            catch (Exception)
            {
                return "Prop Error";
            }
        }

        private void btCustom_MouseUp(object sender, MouseEventArgs e)
        {
            //Find all
            try
            {
                var result = new List<ModelItem>();

                foreach (var item in NavisworksApp.ActiveDocument.CurrentSelection.SelectedItems)
                {
                    var cat = item.DescendantsAndSelf.Where(i => i.PropertyCategories.FindCategoryByDisplayName(tbCatName.Text) != null);

                    var pro = cat.Where(m => m.PropertyCategories.FindCategoryByDisplayName(tbCatName.Text).Properties.FindPropertyByDisplayName(tbPropName.Text) != null);

                    result.AddRange(pro.Where(m => GetPropValue(m.PropertyCategories.FindCategoryByDisplayName(tbCatName.Text).Properties.FindPropertyByDisplayName(tbPropName.Text)).Contains(tbValueName.Text)));
                }
                
                NavisworksApp.ActiveDocument.CurrentSelection.Clear();                
                NavisworksApp.ActiveDocument.CurrentSelection.AddRange(result);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}
 

Комментарии:

1. В чем причина аварии?

2. Что такое сообщение об исключении?

3. вы рассматривали возможность использования базы данных?

4. Я отредактировал, в чем причина аварии. К сожалению, у меня нет никакого сообщения об исключении, когда программа зависает. @NavjotSingh Я совсем новичок в этом языке, поэтому мало что знаю о том, как он работает. Было бы полезно, если бы он мог работать с любым текущим большим списком.

5. Попробуйте использовать базу данных и выполните фильтрацию данных в базе данных, а не в памяти программы. Если это настольное приложение, вы можете рассмотреть возможность его использования SQLite .