【发布时间】:2017-04-10 19:08:40
【问题描述】:
我有一个自定义 BindingList,我想为其创建自定义 AddRange 方法。
public class MyBindingList<I> : BindingList<I>
{
...
public void AddRange(IEnumerable<I> vals)
{
foreach (I v in vals)
Add(v);
}
}
我的问题是大型集合的性能很糟糕。我现在正在调试的案例是尝试添加大约 30,000 条记录,并且花费了不可接受的时间。
在线查看此问题后,问题似乎在于Add 的使用会在每次添加时调整数组的大小。 This answer我想总结为:
如果您使用 Add,它会根据需要逐渐调整内部数组的大小(加倍)
在我的自定义 AddRange 实现中,我可以做什么来指定 BindingList 需要根据项目计数调整大小,而不是让它不断地在添加每个项目时重新分配数组?
【问题讨论】:
-
内部列表调整大小不太可能仅对 30000 个项目花费“不可接受的时间”。最可能的真正问题是每次添加新项目时都会引发更改事件,并且您有一些处理该事件的处理程序(例如某些 UI 控件使用列表)。您可以通过创建绑定列表并用 30k 项填充它来轻松测试它,而无需执行任何其他操作。你会看到它最多需要几毫秒。 PS:它也不会随着每个新项目调整列表的大小,当达到限制时它会增加一倍的大小。
-
@Evk 经过一些测试,您是正确的。我的问题是更改事件。感谢您的确认!
标签: c# bindinglist addrange