0

私は検索しましたが見つかりませんでした。おそらくこの質問は説明しにくいためです。 例えばWPFでは、私はモデルTestList<Test> lstを持っていますので、ObservableCollection<TestViewModel> ObsTestsを構築しなければなりません。そこ多分2つの方法:C#performance:コンストラクタまたはループを使用して既存のアイテムで新しいコレクションを作成しますか?

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

パフォーマンスに優れている私に教え、そしてAsParallelが利用可能な場合は私に最善の解決策を教えてください(などスレッドセーフのObservableCollectionはありますか?私は使用しています.net 4.5

+4

ヒント:パフォーマンスの問題がある場合。プロファイリングを開始します。パフォーマンスに関する問題がない場合は、読みやすいコードを書くことに焦点を合わせます。 – GhostCat

+0

私はパフォーマンス上の問題がありますが、組み合わせが多すぎて、たとえば並列に追加されています。すべての開発者にとって価値ある共通の問題だと思います。 –

+0

第1の方法と第2の方法は同じ性能です。 ObservableCollectionにコレクションを渡すと、ctor内でforeachループが実行されます。 – Karolis

答えて

1

違いはありません。 Ctorは基底クラスCollectionからAddメソッドを使用します。 Reffer:clickCollection

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基礎ので、スレッドセーフではありません。 スレッドセーフなコレクションの場合 - Concurrent名前空間のクラスを使用してください。 MSDNの詳細。

独自の超高速観測可能コレクションを実装することもできます。ここのように: Click!

+0

次に、** INotifyCollectionChanged **を実装するコンカレントコレクションがありますか? –

+0

いいえ、私の最後の言葉を見てください。私はカスタム実装へのリンクを追加しました。 – pwas

+0

ありがとうございます!それは便利です! –

-1

標準的な実装があり、コードを使って同じことができる場合は、標準の実装を選択することをお勧めします。また、それはもっと小さく見えます:)

+0

あなたが言うことは、すべての質問に当てはまるようです。 –

関連する問題