c# – .net使用IComparable排序的值类

我使用绑定到附加到大型集合的iBindingListView实现(第三方dll)的DataGridView遇到了问题.

我的集合类型中有一个名为MyDateTime的属性,它是一个类似于DateTime的值类,但也包含一些遗留代码.

该结构实现了iComparable,iComparable< T>和iEquatable< T>.

我遇到的问题是:

当我对MyDateTimeColumn上的iBindingListView应用排序时,它总是使用非泛型iComparer,导致数十万次不必要的装箱和拆箱.

当我使用DGV提供的自动排序时,它会对列进行字符串排序.保持此列“自动”而不是仅用于此列的程序化是不可接受的.

当我删除非泛型iComparer时,仍然不使用泛型iComparer,它只是在.ToString()上进行字符串比较.

我错过了什么吗?为什么我的通用比较器没有被调用?

最佳答案 最终,这种类型的数据绑定通常是基于反射的,而反射是基于对象的;所以拳击是现实.实际上,你可以在实现IBindingListView时控制它,但这将是一项大量的工作,我猜他们根本没有(理智).

更简单的方法(我假设他们正在使用)是信任PropertyDescriptor,调用GetValue然后使用Comparer.Default.Compare(x,y).一旦你调用GetValue,没有任何一点没有使用你已经装箱的对象(然后必须取消装箱).

如果您不信任PropertyDescriptor,那么您将进入特定于实现的代码,它不支持世界的一般ComponentModel视图(因此它不适用于数据表或定制模型等).

点赞