Tha*_*dar 2 c# collections silverlight optimization profiling
我正在分析其他人编写的 silverlight 组件。我发现了很多热点和瓶颈,现在我遇到了这个:
public static class CollectionExtensions
{
public static void AddRange<T>(this ObservableCollection<T> collection, IEnumerable<T> items)
{
foreach (var item in items)
{
collection.Add(item);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当然,这个扩展方法将 AddRange 方法添加到 ObservableCollection 中,但计算量相当大。有谁有更好的实现,或者对如何提高这段代码的性能有任何建议?
谢谢
Add多次调用会导致INotifyCollectionChanged多次引发,通常会导致 UI 自行重绘。
虽然 Lee 的答案在技术上是正确的,即添加Reset所有项目后引发事件是正确的方法,但我从经验中发现,许多网格控件(例如)并不积极支持该Reset事件。
最普遍支持的选项是修改集合ObservableCollection并重新创建ObservableCollection属性本身。
换句话说,您ObservableCollection在虚拟机上的定义如下......
private ObservableCollection<MyItem> _items;
public ObservableCollection<MyItem> Items {
get { return _items;}
set
{
_items = value;
OnPropertyChanged(()=> Items);
}
}
Run Code Online (Sandbox Code Playgroud)
...添加您的新项目如下...
var tempColl = _items.ToList();
tempColl.AddRange(newItems);
Items = new ObservableCollection(tempColl);
Run Code Online (Sandbox Code Playgroud)
关于此技术要记住的另一件事是它是线程安全的,因为ObservableCollection如果重新创建ObservableCollection. 法线不能通过非调度程序线程的方法ObservableCollection向其添加项目。Add
| 归档时间: |
|
| 查看次数: |
1982 次 |
| 最近记录: |