Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: avc от 03-04-2020, 17:23:23

Название: Сравнить значения параметров
Отправлено: avc от 03-04-2020, 17:23:23
Значения параметров блоков (DynamicBlockReferenceProperty.Value) - это object и сравнивать значения у двух блоков не получается. Похоже сравниваются адреса, а не значения, даже для double. Перерыл все примеры на форуме - не могу найти как сравнить по значению. Должна же быть какая-то возможность в C#, чтоб не писать мегафункцию, перебирающую все типы. В голову приходит только ToString, но это же медленно.
Название: Re: Сравнить значения параметров
Отправлено: Вильдар от 03-04-2020, 17:36:58
это object и сравнивать значения у двух блоков не получается
а почему? Equals(object1, object2) - не то
Название: Re: Сравнить значения параметров
Отправлено: avc от 03-04-2020, 17:45:43
== и Equals одинаково сравнивают object - по адресу
Название: Re: Сравнить значения параметров
Отправлено: Вильдар от 03-04-2020, 17:55:28
А ты проверял?
По моему отличаются== и Equals. Но ты проверь.
https://ru.stackoverflow.com/a/454619/255975
Какие объекты могут быть в значении дин. свойств?
Название: Re: Сравнить значения параметров
Отправлено: avc от 03-04-2020, 18:04:10
Да. Первым делом поменял на Equals. Так же возвращает false для одинаковых значений.
Название: Re: Сравнить значения параметров
Отправлено: avc от 03-04-2020, 18:14:51
Черт! Сравнивал в тесте одинаковые значения, НО одно double, а другое-то int ! И вот тогда Equal тоже спотыкается. На одинаковых типах срабатывает - дает true. На практике сравниваемые параметры одного типа, так что устраивает и слегка неполноценный Equal. Поленился написать .0 в тесте - три часа жизни коту под хвост :(
Название: Re: Сравнить значения параметров
Отправлено: Александр Ривилис от 03-04-2020, 18:26:46
На всякий случай: DynamicBlockReferenceProperty.PropertyTypeCode - возвращает тип свойства.
Код - C++ [Выбрать]
  1. enum DwgDataType {
  2.   kDwgNull = 0,
  3.   kDwgReal = 1,
  4.   kDwgInt32 = 2,
  5.   kDwgInt16 = 3,
  6.   kDwgInt8 = 4,
  7.   kDwgText = 5,
  8.   kDwgBChunk = 6,
  9.   kDwgHandle = 7,
  10.   kDwgHardOwnershipId = 8,
  11.   kDwgSoftOwnershipId = 9,
  12.   kDwgHardPointerId = 10,
  13.   kDwgSoftPointerId = 11,
  14.   kDwg3Real = 12,
  15.   kDwgInt64 = 13,
  16.   kDwgNotRecognized = 19
  17. };
Название: Re: Сравнить значения параметров
Отправлено: Вильдар от 03-04-2020, 18:32:37
НО одно double, а другое-то int
в этом случае, ToString сработал бы )
Название: Re: Сравнить значения параметров
Отправлено: avc от 03-04-2020, 18:55:47
На всякий случай: DynamicBlockReferenceProperty.PropertyTypeCode - возвращает тип свойства
Чрезвычайно полезно. Еще бы к этой табличке соответствующие типы C# написать. А ведь, судя по другим темам, DynamicBlockReferenceProperty ошибки в типах не прощает. Как-то так:
  kDwgReal = double
  kDwgInt32 = int
  kDwgInt16 = short
  kDwgInt8 = byte
  kDwgText = string
  kDwgBChunk = ???
  kDwgHandle = Handle или int ???
  kDwgHardOwnershipId = ObjectId
  kDwgSoftOwnershipId = ObjectId
  kDwgHardPointerId = ObjectId
  kDwgSoftPointerId = ObjectId
  kDwg3Real = double[] или Point3d или Vector3d ???
  kDwgInt64 = long
Название: Re: Сравнить значения параметров
Отправлено: Александр Ривилис от 03-04-2020, 19:11:34
kDwgBChunk =
думаю что byte[], причем первый из них содержит количество байт.
kDwgHandle = Handle или int
скорее string, но нужно проверять
kDwg3Real = double[] или Point3d или Vector3d
думаю что double[3]
Кое-что из этого можно проверить, а кое что вряд ли может встретится у DynamicBlockReferenceProperty.
Название: Re: Сравнить значения параметров
Отправлено: Дмитрий Загорулькин от 03-04-2020, 20:21:43
== и Equals одинаково сравнивают object - по адресу
По моему отличаются== и Equals.
Зависит от того как разработчик реализует. На практике я сталкивался с большими проблемами с этим. Так что, на незнакомых объектах надо проверять опытным путём.
Если надо сравнивать строго по ссылке, то есть специальный метод: Object.ReferenceEquals (https://docs.microsoft.com/ru-ru/dotnet/api/system.object.referenceequals?view=netframework-4.8)
Название: Re: Сравнить значения параметров
Отправлено: Дмитрий Загорулькин от 03-04-2020, 20:34:55
Сравнивал в тесте одинаковые значения, НО одно double, а другое-то int ! И вот тогда Equal тоже спотыкается.
Код - C# [Выбрать]
  1. var v1 = 1;
  2. var v2 = 1.0;
  3. (v1 == v2).Dump();
  4. object.Equals(v1, v2).Dump();
True
False
Я к тому, что как правило, == и != сравнивает значения, а Equals - ещё и типы. Но это не всегда так.
Название: Re: Сравнить значения параметров
Отправлено: Вильдар от 03-04-2020, 20:48:04
var v1 = 1;
var v2 = 1.0;
Пример не очень корректный
Тут типы заданы явно - double и int - и метод == неявно int приводит к double, поэтому true.
Для object типов == сравнивает по ссылке (адрес).
В общем - для тру подхода - похоже надо свое сравнение писать - сравнивать списки и т.п.
Название: Re: Сравнить значения параметров
Отправлено: Дмитрий Загорулькин от 03-04-2020, 20:56:03
и метод == неявно int приводит к double
Что-то сходу ничего не нашёл по этой теме. Откуда инфа? :)
Или надо лезть в исходники double/int?
Название: Re: Сравнить значения параметров
Отправлено: Дмитрий Загорулькин от 03-04-2020, 21:05:49
В общем - для тру подхода - похоже надо свое сравнение писать - сравнивать списки и т.п.
Ага, ещё учесть сравнение double с допуском...
Название: Re: Сравнить значения параметров
Отправлено: Вильдар от 03-04-2020, 21:27:26
Что-то сходу ничего не нашёл по этой теме. Откуда инфа?
https://ru.stackoverflow.com/a/454619/255975
Щас проверил IL - точно, конвертирует:

(https://i.postimg.cc/dDQwCLZT/image.png) (https://postimg.cc/dDQwCLZT)