我想要做的是将 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”的两倍。所以 '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();
然后哪个会实现一个可克隆的接口?