これを防ぐには、新しいオブジェクトを作成する必要があります。複数の方法があります。 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();
コピーの作成どのように - トリッキーにすることができますか?オリジナルにコレクションがある場合、コピーされたオブジェクトは、その同じ古いコレクションへの新しい参照だけでなく、そのコレクションのコピーを取得する必要があることがあります。これは深いクローンと呼ばれます。どちらもうまくいく、それはあなたが必要かどうかにかかっている。
を実装する場合、 'RRProcess'がクラスであるので、参照型。そのため、両方のコレクションのアイテムを変更するのはこのためです。コピーコンストラクタを作成するか、またはすべてのプロパティを手動で割り当てることによって、新しいインスタンスを作成する必要があります。 –
あなたは 'ToList()'を使うときに新しいリストを作成していますが、リスト内のアイテムの "コピー"を作成したいと思いますか? – Fabio
'noDuplicates [0] .Property = 5;'のようなことができるようにしたいのですが、pSortedの元のオブジェクトはその変更を反映するべきではありませんか?そうであれば、何らかの方法でオブジェクトをクローンする必要があります。それが両方のリストに同じオブジェクトであるので、あなたが望むものを得るための唯一の方法は、各リスト内に異なるオブジェクトを持つことです。 – Chris