我有一个方法来交换列表中的2个项目。问题是在更改itemA的值后'temp'变量会更新。初始化后如何防止'temp'更新?
void SwapItems(Item itemA, Item itemB)
{
Item temp = itemA;
itemA.OriginItemPosition = itemB.OriginItemPosition;
itemA.OriginItemRectangle = itemB.OriginItemRectangle;
itemB.OriginItemPosition = temp.OriginItemPosition;
itemB.OriginItemRectangle = temp.OriginItemRectangle;
}
答案 0 :(得分:2)
这是因为temp1保存了itemA的引用,而没有复制它的值。 要在你的情况下交换项目,我会这样做:
void SwapItems(Item itemA, Item itemB)
{
var temp1 = itemA.OriginItemPosition;
var temp2 = itemA.OriginItemRectangle;
itemA.OriginItemPosition = itemB.OriginItemPosition;
itemA.OriginItemRectangle = itemB.OriginItemRectangle;
itemB.OriginItemPosition = temp1;
itemB.OriginItemRectangle = temp2;
}
你也可以有这样的东西,有些人可能会觉得更好:
// Swaps the references themselves for reference-types.
void Swap<T>(ref T a, ref T b)
{
var tmp = a;
a = b;
b = tmp;
}
// Swaps the properties between two Item objects.
void SwapItems(Item a, Item b)
{
Swap(ref a.OriginalItemPosition, ref b.OriginalItemPosition);
Swap(ref a.OriginalItemRectangle, ref b.OriginalItemRectangle);
}
答案 1 :(得分:0)
如果您尝试在List
中交换两个项目,请不要通过交换项目上的属性值来执行此操作(除非您有充分的理由)。通过交换列表中的项目来完成。这种方式如果您例如为您的商品添加更多属性,您无需修改交换方法即可将其全部复制。
static void Swap<T>(IList<T> list, int indexA, int indexB)
{
int tmp = list[indexA];
list[indexA] = list[indexB];
list[indexB] = tmp;
}
答案 2 :(得分:0)
你也可以在项目上实现ICLoneable
Item temp = itemA.Clone();