Сравнить значения параметров

Автор Тема: Сравнить значения параметров  (Прочитано 10641 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Значения параметров блоков (DynamicBlockReferenceProperty.Value) - это object и сравнивать значения у двух блоков не получается. Похоже сравниваются адреса, а не значения, даже для double. Перерыл все примеры на форуме - не могу найти как сравнить по значению. Должна же быть какая-то возможность в C#, чтоб не писать мегафункцию, перебирающую все типы. В голову приходит только ToString, но это же медленно.

Отмечено как Решение avc 03-04-2020, 18:16:56

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: Сравнить значения параметров
« Ответ #1 : 03-04-2020, 17:36:58 »
это object и сравнивать значения у двух блоков не получается
а почему? Equals(object1, object2) - не то

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Сравнить значения параметров
« Ответ #2 : 03-04-2020, 17:45:43 »
== и Equals одинаково сравнивают object - по адресу

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: Сравнить значения параметров
« Ответ #3 : 03-04-2020, 17:55:28 »
А ты проверял?
По моему отличаются== и Equals. Но ты проверь.
https://ru.stackoverflow.com/a/454619/255975
Какие объекты могут быть в значении дин. свойств?

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Сравнить значения параметров
« Ответ #4 : 03-04-2020, 18:04:10 »
Да. Первым делом поменял на Equals. Так же возвращает false для одинаковых значений.

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Сравнить значения параметров
« Ответ #5 : 03-04-2020, 18:14:51 »
Черт! Сравнивал в тесте одинаковые значения, НО одно double, а другое-то int ! И вот тогда Equal тоже спотыкается. На одинаковых типах срабатывает - дает true. На практике сравниваемые параметры одного типа, так что устраивает и слегка неполноценный Equal. Поленился написать .0 в тесте - три часа жизни коту под хвост :(

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Сравнить значения параметров
« Ответ #6 : 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. };
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: Сравнить значения параметров
« Ответ #7 : 03-04-2020, 18:32:37 »
НО одно double, а другое-то int
в этом случае, ToString сработал бы )

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Сравнить значения параметров
« Ответ #8 : 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

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Сравнить значения параметров
« Ответ #9 : 03-04-2020, 19:11:34 »
kDwgBChunk =
думаю что byte[], причем первый из них содержит количество байт.
kDwgHandle = Handle или int
скорее string, но нужно проверять
kDwg3Real = double[] или Point3d или Vector3d
думаю что double[3]
Кое-что из этого можно проверить, а кое что вряд ли может встретится у DynamicBlockReferenceProperty.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Сравнить значения параметров
« Ответ #10 : 03-04-2020, 20:21:43 »
== и Equals одинаково сравнивают object - по адресу
По моему отличаются== и Equals.
Зависит от того как разработчик реализует. На практике я сталкивался с большими проблемами с этим. Так что, на незнакомых объектах надо проверять опытным путём.
Если надо сравнивать строго по ссылке, то есть специальный метод: Object.ReferenceEquals

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Сравнить значения параметров
« Ответ #11 : 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 - ещё и типы. Но это не всегда так.

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: Сравнить значения параметров
« Ответ #12 : 03-04-2020, 20:48:04 »
var v1 = 1;
var v2 = 1.0;
Пример не очень корректный
Тут типы заданы явно - double и int - и метод == неявно int приводит к double, поэтому true.
Для object типов == сравнивает по ссылке (адрес).
В общем - для тру подхода - похоже надо свое сравнение писать - сравнивать списки и т.п.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Сравнить значения параметров
« Ответ #13 : 03-04-2020, 20:56:03 »
и метод == неявно int приводит к double
Что-то сходу ничего не нашёл по этой теме. Откуда инфа? :)
Или надо лезть в исходники double/int?

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Сравнить значения параметров
« Ответ #14 : 03-04-2020, 21:05:49 »
В общем - для тру подхода - похоже надо свое сравнение писать - сравнивать списки и т.п.
Ага, ещё учесть сравнение double с допуском...