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”的两倍。所以 '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 回答