2012-07-05 52 views
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; 
} 

回答

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); 
} 
+0

所以約不會不必要創建對象的討論之後,你提出了一個解決方案,將招致拳擊?至少使其通用。 – 2012-07-05 14:44:07

+0

@AdamHouldsworth你是對的。固定。 – SimpleVar 2012-07-05 14:45:04

+0

+1很好地完成了這些工作,儘管這只是簡單地交換列表項而已,但如果對這些對象的其他引用也需要「交換」,這可能會有用。 – 2012-07-05 14:46:09

0

如果你想交換的兩個項目List,不要通過交換項目上的屬性值(除非你有充分的理由)。通過交換列表中的項目來完成。這樣,如果你爲項目添加更多屬性,您不必修改交換方法即可全部複製它們。

static void Swap<T>(IList<T> list, int indexA, int indexB) 
{ 
    int tmp = list[indexA]; 
    list[indexA] = list[indexB]; 
    list[indexB] = tmp; 
} 
0

你也可以實現對項目ICLoneable的那麼

Item temp = itemA.Clone(); 
+2

@Adam假設這只是替代'temp'的原始分配是合理的。 – Rawling 2012-07-05 14:32:26

+2

@Adam:沒有交換,但是在更新itemA時阻止臨時更改,這是線程的重點,否? – tschmit007 2012-07-05 14:34:07

+1

雖然這假定ICloneable的正確實現,但在我看來,這完全不會打擾ICloneable接口。無論哪種方式,我已經編輯了我以前的評論,我不是downvoter。 – 2012-07-05 14:34:51