私がしたいことは、IEnumerableをメソッドに渡してIEnumerableのコピーを返すことです。しかし、私はコレクション内の各コレクションをコピーではなく、コピーにすることをお勧めします。匿名型のクローン作成?
例:
// some random data from L2S
var data = (from p in sourceData
select new
{
a = 1,
b = "hello",
}).ToArray();
var dataCopy = data.Copy(); // somehow i want 'dataCopy' to be a deep copy of 'data'
foreach (var d in dataCopy)
{
// alter the item in the collection somehow
d.b = d.b + "1";
}
// combine both sets of data
var finalData = data.Union(dataCopy);
のでコレクション 'finalData' 'データ' または 'dataCopy' の2倍の数のアイテムを持っています。したがって、 'dataCopy'のすべての 'b'パラメータの末尾に '1'が追加されますが、 'data'のオブジェクトも参照するため、 'data'の 'b'パラメータにはすべて1が追加されます。終わり。
これらは匿名型なので、匿名型はシリアル化できないため、BinaryFormatterメソッドを使用してオブジェクトを単純に '複製'することはできません。また、Activator.CreateInstanceを使用して新しいものを作成することはできません。匿名型にはパラメータのないコンストラクタがないからです。
シリアライズ可能とマークされたクラスにデータを最初に選択することでこの問題を回避できることがわかりましたが、データベースをクエリするたびにパラメータが変更されるため、異なる...
また、誰かが匿名タイプの代わりをお勧めできますか?例:
var data = (from p in sourceData
select new SomeSortOfAnonymousTypeReplacement(new
{
a = 1,
b = "hello",
})).ToArray();
これはクローン可能なインターフェイスを実装しますか?