所以我需要一种深度克隆的方法.我想要一张卡片列表等于另一张卡片列表,但我还想修改其中一个克隆.
我做了一个复制列表的方法,如下所示:
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方法).
有没有人有任何提示如何简单地克隆列表对象?
这不是真正的深层复制,因为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)
| 归档时间: |
|
| 查看次数: |
1336 次 |
| 最近记录: |