Классификация .net Value с помощью IComparable - PullRequest
4 голосов
/ 21 апреля 2010

У меня проблема с использованием DataGridView, привязанного к реализации iBindingListView (сторонняя dll), присоединенной к большой коллекции.

В моем типе коллекции есть определенное свойство с именем MyDateTime, которое является классом значений, аналогичным DateTime, но также с некоторым устаревшим кодом.

Эта структура реализует iComparable, iComparable<T> и iEquatable<T>.

У меня проблема в следующем:

Когда я применяю сортировку к iBindingListView на MyDateTimeColumn, он ВСЕГДА использует неуниверсальный iComparer, вызывая сотни тысяч ненужных упаковок и распаковок.

Когда я использую автоматическую сортировку, предоставляемую DGV, она выполняет сортировку строк в столбце. Держать этот столбец «автоматический» вместо программного только для этого столбца было бы неприемлемым.

Когда я удаляю неуниверсальный iComparer, универсальный по-прежнему не используется, он просто сравнивает строки в .ToString ().

Я что-то упустил? Почему мой универсальный компаратор не называется bieng для сортировки?

Ответы [ 2 ]

1 голос
/ 21 апреля 2010

В конечном итоге этот тип привязки данных часто основан на отражениях, а отражение - на object; так что бокс это реальность. На самом деле, вы можете контролировать это при реализации IBindingListView, но это будет большой объем работы, и я предполагаю, что они просто не (разумно).

Более простой способ сделать это (который я предполагаю, что они используют) - это доверять PropertyDescriptor, вызывая GetValue и затем используя Comparer.Default.Compare(x,y). После того, как вы позвонили GetValue, нет никакого смысла , а не , использующего объект, который вы уже поместили в коробку (и тогда его придется распаковать).

И если вы не доверяете PropertyDescriptor, то получаете код, очень специфичный для реализации, который не поддерживает общее ComponentModel представление о мире (так что оно не будет работа над таблицами данных или на заказ моделей и т. д.).

1 голос
/ 21 апреля 2010

К сожалению, нет никакого способа обойти это; в какой-то момент DataGridView будет иметь дело со значением как object, что означает, что оно должно быть в штучной упаковке, если это тип значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...