如何从C#中删除struct数组中的项

时间:2011-05-22 05:56:23

标签: c# arrays visual-studio-2008

我在C#中有一个结构,我根据我在这里表达的代码定义了我的结构的数组列表。我在数组列表中添加了项目,但是我也需要从列表中删除几行。你能帮我解决一下如何从结构数组列表中删除一个或多个项目:

public struct SwitchList
    {
        public int m_Value1, m_Value2;
        public int mValue1
        {
            get  { return m_Value1;  }
            set  {m_Value1 = value; }
        }

        public int mValue2
        {
            get  { return m_Value2;  }
            set  {m_Value2 = value; }
        }       
   }

   //Define an array list of struct
   SwitchList[] mSwitch = new SwitchList[10]; 

   mSwitch[0].mValue1=1;
   mSwitch[0].mValue2=2;

   mSwitch[1].mValue1=3;
   mSwitch[1].mValue2=4;

   mSwitch[2].mValue1=5;
   mSwitch[2].mValue2=6;

现在我该如何删除我的一个项目,例如第1项。 谢谢。

4 个答案:

答案 0 :(得分:5)

数组是固定长度的数据结构。

您需要创建一个新的数组,大小比原始数组少一个,并将所有项目复制到它除了要删除的项目之外,然后开始使用新数组而不是原始数组。

为什么不使用List<T>呢?它是一种动态结构,允许您添加和删除项目。

答案 1 :(得分:1)

你需要移动元素并调整数组的大小(这是昂贵的),因为有一些复杂性,你想要在只提供集合的类中隐藏它而不暴露它的存储方式的实现细节。幸运的是,Microsoft已经提供了一个名为List<T>的类,它与System.Collections.Generic命名空间中的一些其他集合类型一起满足了最常见的集合需求。

作为旁注,你应该使用自动属性而不是你所拥有的简单属性样式

答案 2 :(得分:0)

这是不可能的,因为数组是一个固定大小的元素块。因为结构是值类型而不是引用类型,所以您也不能只将元素设置为null。一种选择是创建一个新的较小的数组并将剩余的值复制到新数组。但更好的方法是在我看来使用List。

答案 3 :(得分:0)

如果你真的,真的想要使用数组并移动一些东西,这里有一些如何做的例子:

{
    // Remove first element from mSwitch using a for loop.
    var newSwitch = new SwitchList[mSwitch.Length - 1];
    for (int i = 1; i < mSwitch.Length; i++)
        newSwitch[i - 1] = mSwitch[i];
    mSwitch = newSwitch;
}
{
    // Remove first element from mSwitch using Array.Copy.
    var newSwitch = new SwitchList[mSwitch.Length - 1];
    Array.Copy(mSwitch, 1, newSwitch, 0, mSwitch.Length - 1);
    mSwitch = newSwitch;
}