交换数组中的对象-C#
在C#中,我有一个MenuItem数组。我尝试使用以下代码交换数组索引2和索引3中的两个对象,但未成功:交换数组中的对象-C#,c#,arrays,object,swap,C#,Arrays,Object,Swap,在C#中,我有一个MenuItem数组。我尝试使用以下代码交换数组索引2和索引3中的两个对象,但未成功: MenuItem Temp = Items[2]; Items[2] = Items[3]; Items[3] = Temp; 第二行和第三行不能用C#工作肯定有原因,我可能还不明白。有人能再澄清一点吗?我是否需要更深入地交换对象中的每个属性 编辑-对不起。看起来我在试图清理代码以便发布时把代码弄得一团糟。现在更正 实际代码为: MenuItem TempButton = Me
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.Items
是MenuItem
看看我放在菜单项上的手表,第2行或第3行什么也没发生
MenuItems.Items
属性具有get和set函数,这可能导致问题。。。将进一步调查…您正在设置项目[2]
到临时
,这本来是项目[2]
,因此您实际上什么都没做。我不知道SelectedButton.CountId应该是什么
但如果您只想交换索引2和索引3,可以这样做:
Item Temp = Items[2];
Items[2] = Items[3];
Items[3] = Temp;
是否选择了按钮。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;
我不知道什么是
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" }
尝试:
这应该以泡沫的方式交换解决了问题。我想我把问题复杂化了一点 Items是一个属性,具有返回/设置私有ArrayList的get/set函数 我在类中为MenuItems创建了一个函数,它交换了私有ArrayList中的索引。(它使用了标准的交换代码,类似于我尝试过的代码和每个人在回复中提到的代码。)
谢谢大家的帮助。我记得不久前我遇到过类似的困惑,那是关于房产的。这个属性是非常违反直觉的,原因与示例中的
Items
属性看起来很奇怪是一样的
最终令人困惑的是,该属性被设计为从中复制并分配给,就像您通常使用值类型的字段(如int
、double
)一样。也就是说,要更改索引2处的元素,这将不起作用:
row.ItemArray[2] = "New Value";
上面的代码实质上是将行中的值复制到一个新数组中,获取该副本并将索引2处的值设置为“new value”,然后新数组将立即超出范围。该地产的运作方式是:
object[] items = row.ItemArray;
items[2] = "New Value";
row.ItemArray = items;
非常违反直觉,在我的书中(请图书馆开发人员注意:不要这样做)。但听起来这可能是您在代码中看到的问题背后的问题
换句话说,我认为您(现在)的交换代码是正确的。问题在于谁有聪明的想法使
Items
属性的行为就像一个值字段一样。我遇到了与我想在WPF树视图中上下移动元素相同的问题。因为没有一个答案能解决我的问题,所以这里是我能找到的最好的答案
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);
}
}
}
private void MoveLayerUp()
{
如果(Layers.SelectedItem!=null)
{
int index=Layers.Items.IndexOf(Layers.SelectedItem);
如果(索引>0)
{
var掉期=层.项目[索引-1];
图层。项目。移除(索引-1);
图层.项目.插入(索引,交换);
}
}
}
私有void MoveLayerDown()
{
如果(Layers.SelectedItem!=null)
{
int index=Layers.Items.IndexOf(Layers.SelectedItem);
if(索引
这解决了在集合中分配元素的问题。此外,它还有一个优点,即当前选定的项目永远不会被触摸,并保持选中状态。您的代码没有意义。您似乎将
Temp
和Items[2]
分配给彼此,实际上什么也不交换。您是否有理由在第二行代码中引用MenuItems.Items[]
,而在其他任何地方引用Items[]
?在第二行选择了EdButton.CountID,但其他地方都有神奇的数字?我想我知道这里到底发生了什么。请看我的答案。您是负责项目
属性的开发人员吗?如果是这样,我强烈建议您更改它,因为如果其他开发人员查看此代码,这种行为只会让他们感到困惑。(我假设你不是,但你说“我在类中创建了一个函数…”这一事实让我质疑这个假设。)@DanTao与负责该类的同事聊天。private ArrayList包含不可从外部访问的数据。事实上,如果在没有像AddItems()、removieItems()等成员函数所做的某些预防措施的情况下修改ArrayList,那将是灾难性的。该属性旨在返回该实例的内部数据副本,正如您所怀疑的,它立即超出了范围。数据的修改应该仅通过成员函数进行,因此我实际上认为该属性应该真正转变为返回相关数据的函数。我认为这将阻止其他开发人员假设他们可以(尝试)将数据分配给它……是的,列表根本不应该以这种方式公开,尤其是不使用集合!公开要允许的行为:添加
,删除
,等等。如果
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);
}
}
}