【发布时间】:2017-11-03 22:09:55
【问题描述】:
所以我需要一种深度克隆的方法。我希望一张卡片列表与另一张卡片列表相同,但我还想修改其中一个克隆。
我做了一个方法来复制这样的列表:
public List<Card> Copy(List<Card> cards)
{
List<Card> clone = new List<Card>();
foreach (var card in cards)
{
clone.Add(card);
}
return clone;
}
并像这样使用它:
_cards = new List<Card>();
_thrownCards = new List<Card>();
_cards = Copy(_thrownCards);
_thrownCards.Clear();
我没有 C# 经验,但不知何故,我的直觉告诉我,我的复制方法可以变得更简单。没有其他方法可以深度复制列表吗?我尝试使用MemberWiseClone,但这只是创建了对同一个对象的引用,而不是克隆它(可能我误解了 MemberWiseClone 方法)。
有没有人知道如何简单地克隆一个列表对象?
【问题讨论】:
-
您可以使用
cards.ToList()克隆列表,但如果Card是引用类型,您还需要克隆每个列表元素以获得深层副本。 -
您的方法不是深度克隆,因为所有
Card实例都没有被克隆,而只是复制到另一个列表(假设它们不是结构)。 -
我只想指出,由于您的 Copy 函数创建并返回
new List<Card>(),因此您实际上不需要先初始化 _cards。您可以像这样使用您的函数:_thrownCards = new List<Card>(); ...; _cards = Copy(_thrownCards); _thrownCards.Clear();另外,您在 Copy 函数中实际执行的操作是浅层克隆。这是一个Stackoverflow question,关于两者之间的区别。