C#性能:使用构造函数或循环构造包含现有项的新集合?

时间:2016-06-28 09:34:46

标签: c# performance task-parallel-library observablecollection

我已经搜索但未找到答案,可能是因为这个问题不容易描述。 例如,在WPF中,我有一个模型Test和一个List<Test> lst,然后必须构建一个ObservableCollection<TestViewModel> ObsTests。可能有两种方式:

  1. var ObsTests = new ObservableCollection<TestViewModel>(lst
        .Select(t = > new TestViewModel(t));
    
  2. var ObsTests = new ObservableCollection<TestViewModel>();
    foreach(var test in lst)
    {
        ObsTests.Add(new TestViewModel(test));
    }
    
  3. 请告诉我哪个性能更好,如果AsParallel可用,请告诉我最佳解决方案(例如是ObservableCollection线程安全?我使用.net 4.5

2 个答案:

答案 0 :(得分:1)

没有区别。 Ctor使用基类Add中的Collection方法: Reffer:click

public ObservableCollection(List<T> list)
    : base((list != null) ? new List<T>(list.Count) : list)
{
    CopyFrom(list);
}

private void CopyFrom(IEnumerable<T> collection)
{
    IList<T> items = Items;
    if (collection != null && items != null)
    {
        using (IEnumerator<T> enumerator = collection.GetEnumerator())
        {
            while (enumerator.MoveNext())
            {
                items.Add(enumerator.Current);
            }
        }
    }
}
基于ObservableCollection

Collection因此它不是线程安全的。 对于线程安全的集合 - 使用Concurrent命名空间中的一些类。更多关于MSDN

您还可以实现自己的超快速可观察集合。像这儿: Click!

答案 1 :(得分:-1)

如果您有某些操作的标准实现,并且可以使用您的代码执行相同操作,则最好选择标准实现。它看起来更小:)