2010-09-01 65 views
3

在C#中,我有一個MenuItem數組。我試圖用下面的代碼來交換在索引2和陣列的索引3兩個對象沒有成功:交換數組中的對象 - C#

MenuItem Temp = Items[2]; 
Items[2] = Items[3]; 
Items[3] = Temp; 

必須有爲什麼在第二和第三線不工作在C#的理由,其我可能還不明白。有人能夠澄清一點嗎?我是否必須更深入地交換對象中的每個屬性?

已編輯 - 對不起。看起來像我試圖清理它發佈時弄亂了代碼。現在更正。

實際的代碼是:

MenuItem TempButton = MenuItems.Items[SelectedButton.CountId]; 
MenuItems.Items[SelectedButton.CountId] = MenuItems.Items[SelectedButton.CountId + 1]; 
MenuItems.Items[SelectedButton.CountId + 1] = TempButton; 

MenuItems.ItemsMenuItem

數組放眼觀看我已經放在MenuItems.Items,什麼都不會發生在2線或3

MenuItems.Items屬性具有獲取和設置功能,這可能會導致問題...將進一步調查...

+0

你的代碼沒有意義。你似乎將'Temp'和'Items [2]'分配給對方,沒有任何交換。 – BoltClock 2010-09-01 03:18:24

+2

在第二行代碼中引用'MenuItems.Items []',但在其他地方引用'Items []'有什麼原因嗎?和第二行中的SelectedButton.CountID,但其他地方的幻數? – 2010-09-01 03:19:23

+0

我想我確切地知道這裏發生了什麼。看到我的答案。 – 2010-09-01 05:03:54

回答

3

你是設置Items[2]Temp,這是Items[2]開始,所以你實際上沒有做任何事情。我不知道SelectedButton.CountId應該是什麼。

但如果你只是想換指數2和3,你可以這樣做:

Item Temp = Items[2]; 
Items[2] = Items[3]; 
Items[3] = Temp; 
1

SelectedButton.CountId = 2?如果是的話我會試試這個:

Item Temp = MenuItems.Items[2]; 
MenuItems.Items[SelectedButton.CountId] = MenuItems.Items[3]; 
MenuItems.Items[3] = Temp; 

注意最後一行有3個。

這會更清楚:

Item Temp = MenuItems.Items[SelectedButton.CountId]; 
MenuItems.Items[SelectedButton.CountId] = MenuItems.Items[3]; 
MenuItems.Items[3] = Temp; 
1

我不知道是什麼SelectedButton.CountId應該是,但你把Temp右後衛在同一插槽是開始。而MenuItems.Items似乎與Items完全不同。

string[] items = { "one", "two", "three" }; 
string temp = items[1]; // temp = "two" 
items[1] = items[2]; // items[1] = "three" 
items[2] = temp; // items[2] = "two" 

// items is now 
// { "one", "three", "two" } 
1

嘗試:

Item Temp = Items[SelectedButton.CountId]; 
Items[SelectedButton.CountId] = MenuItems.Items[SelectedButton.CountId+1]; 
Items[SelectedButton.CountId+1] = Temp; 

這應該在一個泡沫的方式

-1

解決問題交換。我認爲我有點太複雜了。

MenuItems.Items是一個get/set函數返回/設置私有ArrayList的屬性。

我在MenuItems的類中創建了一個交換私有ArrayList中的索引的函數。 (它使用的標準交換代碼類似於我試過的以及大家在回覆中提到的內容)。

感謝大家的幫忙。

+0

你是否是負責'Items'屬性的開發者?如果是這樣,我**高度推薦你改變它,因爲如果他們看過這段代碼,這種行爲只會讓其他開發者感到困惑。 (我假設你不是,但是你說「我在課堂上創建了一個功能......」的事實讓我對這個假設產生了疑問。) – 2010-09-01 05:02:41

+0

@DanTao與同事負責聊天班上。私有ArrayList包含的數據不能從外部訪問。事實上,如果ArrayList被修改時沒有一定的預防措施,像AddItems(),RemoveItems()等成員函數一樣,它可能是災難性的。該財產打算在該情況下返回內部數據的副本,並且如您所懷疑的那樣,它立即超出範圍。 – tbv 2010-09-01 06:06:23

+0

修改數據只能通過成員函數進行修改,所以我實際上認爲該屬性應該真正轉化爲返回相關數據的函數。我認爲這會阻止其他開發人員假設他們可以(嘗試)將數據分配給它... – tbv 2010-09-01 06:06:48

1

我記得前段時間遇到類似的困惑,有DataRow.ItemArray屬性。這個屬性與您的示例中的Items屬性看起來很奇怪的原因非常相似,這是非常不直觀的。

是什麼最終如此混亂的是,財產被設計爲分配給複製,就像你通常會與值類型的字段(如intdouble等)。即,在索引2來改變元件,這是行不通的:

row.ItemArray[2] = "New Value"; 

上面的代碼將基本上拷貝該行中的值到一個新的數組,採取該副本,並設置在索引值2添加到「新值」,然後新數組立即超出範圍。該方法這個屬性是應該工作是:

object[] items = row.ItemArray; 
items[2] = "New Value"; 
row.ItemArray = items; 

非常違反直覺的,在我的書(注意庫開發:不這樣做)。但是這聽起來可能是你用代碼看到的問題背後的問題。

換句話說,我認爲你有(現在)的交換代碼是正確的。問題在於誰擁有使Items屬性表現得如同它是一個值域的明智想法。

0

我遇到了同樣的問題,因爲我想在WPF-TreeView中上下移動元素。由於沒有答案在這裏解決了我的問題是我能找到的最好的。

private void MoveLayerUp() 
    { 
     if(Layers.SelectedItem != null) 
     { 
      int index = Layers.Items.IndexOf(Layers.SelectedItem); 
      if (index > 0) 
      { 
       var swap = Layers.Items[index - 1]; 
       Layers.Items.RemoveAt(index - 1); 
       Layers.Items.Insert(index, swap); 
      } 
     } 
    } 

    private void MoveLayerDown() 
    { 
     if (Layers.SelectedItem != null) 
     { 
      int index = Layers.Items.IndexOf(Layers.SelectedItem); 
      if (index < Layers.Items.Count-1) 
      { 
       var swap = Layers.Items[index + 1]; 
       Layers.Items.RemoveAt(index + 1); 
       Layers.Items.Insert(index, swap); 
      } 
     } 
    } 

這解決了分配集合中元素的問題。此外,它具有的優點是當前選擇的項目從未被觸摸並保持選擇。