1

我有一种交换列表中 2 个项目的方法。问题是在我更改 itemA 的值后,“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;
}
4

3 回答 3

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);
}
于 2012-07-05T14:25:24.867 回答
0

如果您尝试交换 a 中的两个项目List,请不要通过交换项目上的属性值来做到这一点(除非您有充分的理由)。通过交换列表中的项目来做到这一点。这样,如果您例如向您的项目添加更多属性,则无需修改交换方法即可将它们全部复制。

static void Swap<T>(IList<T> list, int indexA, int indexB)
{
    int tmp = list[indexA];
    list[indexA] = list[indexB];
    list[indexB] = tmp;
} 
于 2012-07-05T14:29:10.457 回答
0

你也可以在 Item 上实现ICLoneable然后

Item temp = itemA.Clone();
于 2012-07-05T14:29:36.713 回答