是否有更好的深度克隆方法列表?

Jes*_*per 4 c# deep-copy

所以我需要一种深度克隆的方法.我想要一张卡片列表等于另一张卡片列表,但我还想修改其中一个克隆.

我做了一个复制列表的方法,如下所示:

    public List<Card> Copy(List<Card> cards)
    {
        List<Card> clone = new List<Card>();
        foreach (var card in cards)
        {
            clone.Add(card);
        }
        return clone;
    }
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

        _cards = new List<Card>();
        _thrownCards = new List<Card>();

        _cards = Copy(_thrownCards);
        _thrownCards.Clear();
Run Code Online (Sandbox Code Playgroud)

我没有C#的经验,但不知怎的,我的直觉告诉我,我的复制方法可以变得更简单.没有其他方法可以深度复制列表吗?我尝试使用MemberWiseClone,但这只是创建了对同一个对象的引用,而不是克隆它(可能我误解了MemberWiseClone方法).

有没有人有任何提示如何简单地克隆列表对象?

Tim*_*ter 6

这不是真正的深层复制,因为Card实例仍然相同,只有列表不同.你可以这么简单:

List<Card> cloneList = cards.ToList();
Run Code Online (Sandbox Code Playgroud)

您还需要"复制" Card实例的所有属性:

public List<Card> Copy(List<Card> cards)
{
    List<Card> cloneList = new List<Card>();
    foreach (var card in cards)
    {
        Card clone = new Card();
        clone.Property1 = card.Property1;
        // ... other properties
        cloneList.Add(clone);
    }
    return cloneList;
}
Run Code Online (Sandbox Code Playgroud)

您还可以提供一个工厂方法来创建给定Card实例的克隆:

public class Card
{
    // ...

    public Card GetDeepCopy()
    {
        Card deepCopy = new Card(); 
        deepCopy.Property1 = this.Property1;
        // ...
        return deepCopy;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您将此逻辑封装在一个可以访问private成员(字段,属性,构造函数)的位置.将上述Copy方法中的行更改为:

cloneList.Add(card.GetDeepCopy()); 
Run Code Online (Sandbox Code Playgroud)