Поделиться:
Уведомления
Очистить все

[Решено] Метод Intersect в плагине C# не работает. Подскажите, почему?

1 Сообщения
1 Пользователи
0 Лайки
256 Просмотры
0
Автор темы

Вобщем, в "selects" - текущий выбор юзера. В "rebarAlls" - коллекция арматурных стержней, отфильтрованных по определенным параметрам. Обе коллекции содержат элементы, проверил по id - пересекающиеся элементы есть. Отчего жеж итоговое rebars.count у меня всегда получается ноль? : ) 

UIDocument uidoc = cmdData.Application.ActiveUIDocument;
IList<Element> selects = uidoc.Selection.GetElementIds().Select(x => doc.GetElement(x)).ToList();
IList<Element> rebarAlls = GetRebarElements(doc);
string str1="";
foreach (Element element in selects)
{
ElementId id = element.Id;
str1 = str1 + id.ToString() + "\n";
}
str1 = str1 + "\n" + "\n";
foreach (Element element in rebarAlls)
{
ElementId id = element.Id;
str1 = str1 + id.ToString() + "\n";
}
rebars = selects.Intersect(rebarAlls).ToList();
TaskDialog.Show("RebarSketch", str1);
1 Ответ
0
Автор темы

Вобщем, оказалось, что "Intersect для корректной работы требуется чтобы в типе были переопределены методы Equals, GetHashCode. Класс Element этого не делает. Значит, нужно создать класс реализующий IEqualityComparer<Element> и передать его в метод Intersect".

Сделал, как подсказали, и заработало! 

using Autodesk.Revit.DB;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ME.Functions
{
public class ElementEqualityComparer : IEqualityComparer<Element>
{
public bool Equals(Element x, Element y)
{
if (ReferenceEquals(x, y))
return true;
if (x is null || y is null)
return false;
return x.Id == y.Id;
}

public int GetHashCode(Element obj)
{
return obj.Id.GetHashCode();
}
}
}
...

rebars = rebarAlls.Intersect(selects, new ElementEqualityComparer()).ToList()

 

Ответ