2016-03-30 3 views
1

背景:WPFのUIに直接リンクされているオブジェクトのリストがあります。私はそれらのオブジェクトでいくつかの作業をする必要がありますが、私はそれら(非同期)と一緒に作業している間、私はUI(パフォーマンスと審美的な理由)をリフレッシュしたくありません。参照を保持しないオブジェクトのコピー

私は、(Collection<T>.CopyTo(T[] array, int index)を使用して)アイテムをコピーし、コピーを処理して、元のリストをコピーしたものを上書きすると考えました。問題は、それでも参照が保持され、UIが継続的にリフレッシュされるということです。私が何をしたかの コード例:

MyUIObject[] myCopiedList = new MyUIObject[MyObjectsLinkedToTheUI.Count]; 
    MyObjectsLinkedToTheUI.CopyTo(myCopiedList); 
    foreach (MyUIObject myCopiedItem in myCopiedList) 
    { 
     //while I do this, the UI is still updated 
     PerformLongAndWearyOperationAsync(myCopiedItem); 
    } 
    MyObjectsLinkedToTheUI.Clear(); 
    foreach (var myCopiedItem in myCopiedList) 
    { 
     MyObjectsLinkedToTheUI.Add(myCopiedItem); 
    } 

元のオブジェクトへの参照を保持することなく、自分のアイテムをコピーする可能性がありますか? 1

UPDATEは、これまでのあなたの貢献をいただき、ありがとうございます。私が言及するのを忘れた1つの事:これはWindows Phone 8.1のため、ICloneableは利用できません。

+4

「複製」する必要がある場合は、新しいオブジェクトを作成してプロパティをコピーし、参照型を複製する必要があります。 「クローン」「シャローコピー」と「ディープコピー」を検索すると、ニーズに合ったものを見つけることができます。 –

答えて

4

何とかそれらをクローンする必要があります。いずれかのICloneableインターフェイスを実装し、手動ですべての書き換えを行うか、オブジェクトのシリアライズとデシリアライズのようなハック/トリックを使用できます。

連載を持つフローは、このようなものです:

  1. はそれをシリアル化してオブジェクト
  2. を取り、例えば、JSON、binnary形式など
  3. は今、あなたは新しいにステップ2で得たものをデシリアライズオブジェクト

オブジェクトのコピーはそのようになりますが、処理能力は高くなりますが、エラーを捕まえるのが難しくなります。しかし、それは簡単な方法です。 ICloneableを実装することはより信頼できますが、すべてのマッピングを自分で書く必要があります。

また、クラスの代わりに構造体を使用することを検討してください。 Structsは常に値ではなく参照としてコピーされます。それにはいくつかの欠点がありますので、使用シナリオに合っているかどうかはあなた次第です。

+0

また、[Automapper](http://automapper.org/)のようなツールを使って 'ICloneable'を実装すると、定型コピーのいくつかを削除することができます。 – CodingGorilla

+1

@CodingGorilla確かに、それはプログラマのために物事をスピードアップするのに役立つかもしれないアプローチの一つですが、基本アイデアは同じです - 何とか明示的にするか、いくつかのハック/トリックに行くかのどちらかです。それが要件を満たす場合は、構造体を使用します。 – Vir

+0

本当に私を満足させるわけではありませんが、他の方法がない場合は...ありがとうございます。私はマニュアルマッピングの方法に進むことに決めました。 – GuyMontag

関連する問題