2009-08-17 29 views
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' 'データ' または '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(); 

これはクローン可能なインターフェイスを実装しますか?

答えて

1

で答えました。 C#では、すべての匿名型は浅く不変です。それらは、インスタンスに含まれる値を変更することによって変更できます(値をコレクションに追加するなど)。しかし、クローンを介して値の浅いコピーを作成しても、この副作用が既存のインスタンスでは見えないようにすることはできません。

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

あなたが達成しようとしていることについてもっと詳しく知ることができますか?簡単な解決法があるかもしれません。

関連する問題