2017-01-03 6 views
0

は私がNODUPLICATESで何かを変更した場合、それは同様pSortedでそれを変更することを、次のコード重複を削除している間にオブジェクトの新しいリストを作成するには?

List<RRProcess> noDuplicates = pSorted 
    .GroupBy(i => i.pID) 
    .Select(group => group.First()) 
    .ToList(); 

問題があるのです。 新しいリストを作成する方法についてのすべての記事を読んだことがありますが、私の場合はそれを理解できません。どうすればいいですか?

これは、同じpIDを持つオブジェクトを複製せずに、pSortedの要素から新しいリストを作成するにはどうすればいいですか?

ありがとう

+0

を実装する場合、 'RRProcess'がクラスであるので、参照型。そのため、両方のコレクションのアイテムを変更するのはこのためです。コピーコンストラクタを作成するか、またはすべてのプロパティを手動で割り当てることによって、新しいインスタンスを作成する必要があります。 –

+0

あなたは 'ToList()'を使うときに新しいリストを作成していますが、リスト内のアイテムの "コピー"を作成したいと思いますか? – Fabio

+0

'noDuplicates [0] .Property = 5;'のようなことができるようにしたいのですが、pSortedの元のオブジェクトはその変更を反映するべきではありませんか?そうであれば、何らかの方法でオブジェクトをクローンする必要があります。それが両方のリストに同じオブジェクトであるので、あなたが望むものを得るための唯一の方法は、各リスト内に異なるオブジェクトを持つことです。 – Chris

答えて

6

これを防ぐには、新しいオブジェクトを作成する必要があります。複数の方法があります。 ICloneableを使用するか、新しいオブジェクトを自分で作成してください。

は、あなたのクラスは、ICloneable実装している場合:

List<RRProcess> noDuplicates = pSorted 
    .GroupBy(i => i.pID) 
    .Select(group => new RRProcess(group.First())) 
    .ToList(); 

またはパラメータなしのコンストラクタ+オブジェクト初期化子を使用して::

List<RRProcess> noDuplicates = pSorted 
    .GroupBy(i => i.pID) 
    .Select(group => (RRProcess) group.First().Clone()) 
    .ToList(); 

をそれとも、元からコピーを作成することができますコンストラクタを持っている場合

List<RRProcess> noDuplicates = pSorted 
    .GroupBy(i => i.pID) 
    .Select(group => group.First()) 
    .Select(x => new RRProcess { pID = x.pID /* etc for other properties */ }) 
    .ToList(); 

コピーの作成どのように - トリッキーにすることができますか?オリジナルにコレクションがある場合、コピーされたオブジェクトは、その同じ古いコレクションへの新しい参照だけでなく、そのコレクションのコピーを取得する必要があることがあります。これは深いクローンと呼ばれます。どちらもうまくいく、それはあなたが必要かどうかにかかっている。

+0

あなたの 'ICloneable'提案は動作しません。なぜなら、' RRProcess'へのキャストがないからです。 – Bauss

+0

修正しました。 –

+0

ありがとうございました。 :D –

3

LINQで直接実行することはできません。追加コードが必要です。 (この場合RRProcessで)あなたのオブジェクトはオブジェクトである任意のメンバーを持っていない場合は

、あなたは以下のようなあなたのオブジェクトのcloneメソッドを実装することができます

public RRProcess Clone() 
    { 
     return this.MemberwiseClone(); 
    } 

は私が注意しなければならMemberwiseCloneすること浅いクローンしか生成しないため、なぜオブジェクトをクローン化しないのでしょうか。

RRProcessがオブジェクトを実装していて、それらもクローンする必要がある場合は、深いクローンを実行する必要があります。

この回答を参照してください:https://stackoverflow.com/a/129395/2026276

あなたはICloneable参照を実装するために、上記を使用することができます。https://msdn.microsoft.com/en-us/library/system.icloneable(v=vs.110).aspx

しかし、私はICloneableからClone()だけいるだろうオブジェクトを返すので、なしにそれを実装するために、あなたのケースであなたをアドバイスあなたの側からさらにキャストする必要があり、それはあなたのケースでは価値がないかもしれません。

何あなたがして行うことができますが、このです:

List<RRProcess> noDuplicates = pSorted 
    .GroupBy(i => i.pID) 
    .Select(group => group.First().Clone()) 
    .ToList(); 

あなたはICloneable

List<RRProcess> noDuplicates = pSorted 
    .GroupBy(i => i.pID) 
    .Select(group => (RRProcess)group.First().Clone()) 
    .ToList(); 
関連する問題