3

私がやりたいことは、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();

次に、クローン可能なインターフェイスを実装するのはどれですか?

4

1 に答える 1

1

匿名型のクローンを作成することでどのような価値が得られると思うか、興味があります。C# では、すべての匿名型は浅く不変です。インスタンスに含まれる値を変更することで変更できます (コレクションに値を追加するなど)。ただし、クローンを介して値の浅いコピーを作成しても、この副作用が既存のインスタンスで表示されるのを防ぐことはできません。

Clone が匿名型に対して持つことができる唯一の値は、値を深く複製する場合です。つまり、匿名型インスタンスとそのすべての内部値の両方を再帰的に複製します。これは非常にコストのかかる操作であり、おそらくあなたが探しているものではありません。

あなたが達成しようとしていることについて、もっと詳しく教えていただけますか?もっと簡単な解決策があるかもしれません。

于 2009-08-17T02:55:32.797 に答える