删除数组元素同时移动其他元素?

时间:2016-05-05 19:54:03

标签: c# arrays

我对编程非常陌生,所以请耐心等待。

我制作了2个相互对应的阵列;一个是Name数组,一个是Phone Number数组。这个想法是NameArray中的spot [1]对应于PhoneArray中的spot [1]。换句话说,我需要保持这些配对'在机智。

我试图创建一个删除数组中某个点的函数,并将所有内容向下移动一个,以填充已删除元素留空的空间。

  namearray = namearray.Where(f => f != iNum).ToArray();

是我尝试过的,iNum是与数组中标记为删除的元素对应的数字。

我还尝试将其转换为列表,删除该项目,然后再次对其进行排列。

        var namelist = namearray.ToList();
        var phonelist = phonearray.ToList();
        namelist.Remove(txtName.Text);
        phonelist.Remove(txtPhone.Text);
        namearray = namelist.ToArray();
        phonearray = phonelist.ToArray();
        lbName.Items.Clear();
        lbPhone.Items.Clear();
        lbName.Items.AddRange(namearray);
        lbPhone.Items.AddRange(phonearray);

使用txtName.Text和txtPhone.Text作为相应列表框中的删除字符串。

有人可以建议一个更好的方法吗/我做错了什么/如何解决?

谢谢你们 -Zack

5 个答案:

答案 0 :(得分:2)

更好的方法是拥有一个包含Name和Phone Number对象的类数组:

public class PersonData
{
    public string Name { get; set; }
    public string Phone { get; set; }
}

public PersonData[] data;

这样,它不是保持两个数组同步,而是一个包含所有适当数据的数组。

答案 1 :(得分:0)

如果 namearray phonearray 包含字符串,并且您知道要删除的元素的索引( iNum ),那么您需要使用采用第二个参数的Where扩展的重载,即评估中当前元素的索引

namearray = namearray.Where((x, y) => y != iNum).ToArray();

但是,为您的任务使用类的建议是正确的。 Namearray Phonearray (以及您将来需要处理的任何其他内容)被视为Person类的属性,而不是使用数组使用{ {1}}

List<Person>

在这个场景中删除一个知道LastName的项目可以写成

public class Person
{
    public string FirstName {get; set;}
    public string LastName {get; set;}
    public string Phone {get; set;}

}

List<Person> people = new List<Person>()
{
    {new Person() {FirstName="Steve", LastName="OHara", Phone="123456"}},
    {new Person() {FirstName="Mark", LastName="Noname", Phone="789012"}}
};

(或之前使用要删除的元素列表中的索引)

people = people.Where(x => x.LastName != "OHara").ToList();

答案 2 :(得分:0)

尝试循环遍历两个数组,每次都将每个数据的值向下移动。

在要删除的值的索引处启动循环。因此,您会找到所需的IndexOf(T)值,将其存储为deleteIndex并从该索引开始运行循环。

当你到达数组的末尾时,将最后一个值设置为null或string.Empty(取决于数组保存的值类型)。

有点像这样:

var deleteIndex = namearray.IndexOf("TheStringYouWantToDelete");

for (int i = deleteIndex; i < namearray.Length; i++)
{
    if (i == namearray.Length - 1) // The "last" item in the array.
    {
        namearray[i] = string.Empty; // Or null, or your chosen "empty" value.
        phonearray[i] = string.Empty; // Or null, or your chosen "empty" value.
    }
    else
    {
        namearray[i] = namearray[i+1];
        phonearray[i] = phonearray[i+1];
    }
}

这将用于删除和移动索引中的'down'值。

您也可以重写代码以便以其他方式移动它们,因为它的工作方式类似。

完全重新排序?不同的球赛...

希望这有帮助。

答案 3 :(得分:0)

其他答案提供了一些更好的设计建议,但是如果您使用ListBox并希望坚持使用数组,则可以执行此操作来同步它们:

     int idx = lbName.Items.IndexOf(txtName.Text);
     if (idx > -1)
     {
        lbName.Items.RemoveAt(idx);
        lbPhone.Items.RemoveAt(idx);
     }
     namearray = lbName.Items.Cast<string>().ToArray<string>();
     phonearray = lbPhone.Items.Cast<string>().ToArray<string>();

答案 4 :(得分:0)

请改用词典。

Dictionary<string, string> phoneBook = new Dictionary<string, string>();
phoneBook["Foo"] = "1234567890";
phoneBook["Bar"] = "0987654321";
phoneBook.Remove("Bar");