.net使用IComparable排序的值类

时间:2010-04-21 14:48:22

标签: c# .net winforms sorting datagridview

我使用绑定到大型集合的DataGridView实现(第三方dll)的iBindingListView来解决问题。

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

此结构实现iComparableiComparable<T>iEquatable<T>

我遇到的问题是:

当我对iBindingListView上的MyDateTimeColumn应用排序时,它始终使用非通用iComparer,导致数十万次不必要的装箱和拆箱。

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

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

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

2 个答案:

答案 0 :(得分:1)

不幸的是,没有办法解决这个问题;在某些时候,DataGridView将以object的形式处理该值,这意味着如果它是值类型,则必须将其装箱。

答案 1 :(得分:1)

最终,这种类型的数据绑定通常是基于反射的,而反射是基于object的;所以拳击是现实。实际上,可以在实施IBindingListView时控制它,但它会是大量工作量,我猜他们根本没有(明智的) )。

执行此操作的简单方法(我假设他们正在使用)是信任PropertyDescriptor,调用GetValue然后使用Comparer.Default.Compare(x,y)。一旦你打电话给GetValue,就没有任何一点使用你已装箱的对象(然后必须取消装箱)。

如果您信任PropertyDescriptor您正在使用特定于实现的代码,那么这不会支持全局ComponentModel视图(所以它不适用于数据表或定制模型等。)