#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
.