C# 更快地填充可观察到的集合
我假设这两个代码段的作用相同。我想知道哪一个更快,为什么?其中一个比另一个快得多C# 更快地填充可观察到的集合,c#,windows-phone-7,C#,Windows Phone 7,我假设这两个代码段的作用相同。我想知道哪一个更快,为什么?其中一个比另一个快得多 ObservableCollection<Something> CollectionToFill; ObservableCollection<Something> SourceCollection; 您应该意识到,这两个做不同的事情。第一个集合创建一个新集合并替换旧集合中的引用。第二个将项目添加到现有集合中。听起来可能一样,但事实并非如此。但无论如何 第一个将更快,因为它不会在每个元素之后
ObservableCollection<Something> CollectionToFill;
ObservableCollection<Something> SourceCollection;
您应该意识到,这两个做不同的事情。第一个集合创建一个新集合并替换旧集合中的引用。第二个将项目添加到现有集合中。听起来可能一样,但事实并非如此。但无论如何 第一个将更快,因为它不会在每个元素之后引发事件
Add
在内部使用InsertItem
,如下所示:
protected override void InsertItem(int index, T item)
{
this.CheckReentrancy();
base.InsertItem(index, item);
this.OnPropertyChanged("Count");
this.OnPropertyChanged("Item[]");
this.OnCollectionChanged(NotifyCollectionChangedAction.Add, item, index);
}
base.InsertItem
声明为:
protected virtual void InsertItem(int index, T item)
{
this.items.Insert(index, item);
}
如您所见,添加项时会引发3个事件
构造函数使用CopyFrom
方法将项直接添加到基础集合中,而不引发任何事件:
public ObservableCollection(IEnumerable<T> collection)
{
if (collection == null)
{
throw new ArgumentNullException("collection");
}
this.CopyFrom(collection);
}
private void CopyFrom(IEnumerable<T> collection)
{
IList<T> items = base.Items;
if (collection != null && items != null)
{
using (IEnumerator<T> enumerator = collection.GetEnumerator())
{
while (enumerator.MoveNext())
{
items.Add(enumerator.Current);
}
}
}
}
公共可观察集合(IEnumerable集合)
{
if(集合==null)
{
抛出新的ArgumentNullException(“集合”);
}
此.CopyFrom(集合);
}
私有void CopyFrom(IEnumerable集合)
{
IList项目=基本项目;
if(集合!=null&&items!=null)
{
使用(IEnumerator枚举器=collection.GetEnumerator())
{
while(枚举数.MoveNext())
{
项。添加(枚举器。当前);
}
}
}
}
protected virtual void InsertItem(int index, T item)
{
this.items.Insert(index, item);
}
public ObservableCollection(IEnumerable<T> collection)
{
if (collection == null)
{
throw new ArgumentNullException("collection");
}
this.CopyFrom(collection);
}
private void CopyFrom(IEnumerable<T> collection)
{
IList<T> items = base.Items;
if (collection != null && items != null)
{
using (IEnumerator<T> enumerator = collection.GetEnumerator())
{
while (enumerator.MoveNext())
{
items.Add(enumerator.Current);
}
}
}
}