Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更快地填充可观察到的集合_C#_Windows Phone 7 - Fatal编程技术网

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);
            }
        }
    }
}