我使用绑定到大型集合的DataGridView
实现(第三方dll)的iBindingListView
来解决问题。
我的集合类型中有一个名为MyDateTime
的属性,它是一个类似于DateTime的值类,但也包含一些遗留代码。
此结构实现iComparable
,iComparable<T>
和iEquatable<T>
。
我遇到的问题是:
当我对iBindingListView
上的MyDateTimeColumn
应用排序时,它始终使用非通用iComparer
,导致数十万次不必要的装箱和拆箱。
当我使用DGV提供的自动排序时,它会对列进行字符串排序。保留此列“自动”而不是仅用于此列的程序化是不可接受的。
当我删除非泛型iComparer时,仍然不使用泛型iComparer,它只是在.ToString()上进行字符串比较。
我错过了什么吗?为什么我的通用比较器没有被调用?
答案 0 :(得分:1)
不幸的是,没有办法解决这个问题;在某些时候,DataGridView
将以object
的形式处理该值,这意味着如果它是值类型,则必须将其装箱。
答案 1 :(得分:1)
最终,这种类型的数据绑定通常是基于反射的,而反射是基于object
的;所以拳击是现实。实际上,可以在实施IBindingListView
时控制它,但它会是大量工作量,我猜他们根本没有(明智的) )。
执行此操作的简单方法(我假设他们正在使用)是信任PropertyDescriptor
,调用GetValue
然后使用Comparer.Default.Compare(x,y)
。一旦你打电话给GetValue
,就没有任何一点不使用你已装箱的对象(然后必须取消装箱)。
如果您不信任PropertyDescriptor
您正在使用特定于实现的代码,那么这不会支持全局ComponentModel
视图(所以它不适用于数据表或定制模型等。)