私がやりたいことは、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」には、「data」または「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();
次に、クローン可能なインターフェイスを実装するのはどれですか?