SomeClass tmp;
for(...)
{
tmp = this[i]; //fast
this[i] = this[position]; //slow
this[position] = tmp; //slow
}
正如评论所示,第一项任务并不需要花费太多时间,但其他两项工作确实很慢。我无法理解它背后的原因,但由于它排序列表50左右的元素需要大约两秒钟。 好吧,我可以使用一些解决方法,但它似乎有点难看。此外,我真的想知道导致这种行为的原因。
答案 0 :(得分:1)
主要问题(如果是BindingList
)是每次在DataGridView
内设置任何内容时,BindingList
都会尝试更新。这意味着您标记为慢速的两条线很可能不会慢,但速度慢,因为它们会触发DataGridView
刷新,这意味着它会在排序操作中刷新很多次。
你可以通过封装BindingList
而不是子类化来解决这个问题,而不是在排序期间引发事件,但是等到排序完成,然后刷新整个列表。
答案 1 :(得分:1)
发生减速是因为赋值会导致绑定到该列表的任何内容重绘(例如,DataGridView)。
您应该修改排序方法,以便在更改列表时禁用引发事件。
var origRaiseEvents = this.RaiseListChangedEvents;
this.RaiseListChangedEvents = false;
try
{
// here goes your original code.
}
finally
{
this.RaiseListChangedEvents = origRaiseEvents;
}