0
public class MyStuff : ICloneable
{
    public int A {get;set;}
    public int B {get;set;}

    public object Clone()
    {
        MyStuff Copy = (MyStuff)MemberwiseClone();
        return Copy;
    }
}

现在让我们假设我有一个 MyStuff 数组

MyStuff[] MyStuffObjs = PopulateMyStuff();

创建实现 Clone 方法的 MyStuffObjs 的克隆的最快/最简单的方法是什么?

我知道我可以遍历集合并复制每个集合。

List<MyStuff> NewStuff = new List<MyStuff>();
foreach(var Stuff in MyStuffObjs)
{
    NewStuff.Add(Stuff.Clone());
}
return NewStuff.ToArray();

肯定有更好的方法吗?

4

2 回答 2

1

您可以为此使用 Linq:

return MyStuffObjs.Select(item => (MyStuff)item.Clone()).ToArray();

你甚至可以像这样创建一个辅助方法

public static class MyExtensions
{
    public static T[] DeepClone<T>(this T[] source) where T : ICloneable
    {
        return source.Select(item => (T)item.Clone()).ToArray();
    }
}

并按如下方式使用

return MyStuffObjs.DeepClone();
于 2015-10-27T17:45:56.803 回答
0

只是Select/ToArray会更短,但实际上没有什么比遍历所有项目并调用Clone.

更短的代码:

 return MyStuffObjs.Select( x=> x.Clone()).ToArray();

更快的代码 - 预分配数组而不是使用列表:

MyStuff[] cloned = new MyStuff[MyStuffObjs.Length];
for (var i = 0; i < cloned.Lenght; i++)
{
    cloned[i] = MyStuffObjs[i].Clone();
}
于 2015-10-27T17:47:56.530 回答