优化C#代码片段、ObservableCollection和AddRange

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 中,但计算量相当大。有谁有更好的实现,或者对如何提高这段代码的性能有任何建议?

谢谢

toa*_*akz 6

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