1

リスト内の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;
}
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

で 2 つのアイテムを交換しようとしている場合はList、アイテムのプロパティの値を交換しないでください (正当な理由がない限り)。リスト内のアイテムを交換することでそれを行います。このようにして、たとえば項目にさらにプロパティを追加する場合、swap メソッドを変更してそれらをすべてコピーする必要はありません。

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 に答える