Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
交换数组中的对象-C#_C#_Arrays_Object_Swap - Fatal编程技术网

交换数组中的对象-C#

交换数组中的对象-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

在C#中,我有一个MenuItem数组。我尝试使用以下代码交换数组索引2和索引3中的两个对象,但未成功:

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