我对编程非常陌生,所以请耐心等待。
我制作了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
答案 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");