我正在尝试查看当用户输入某些文本时,它会在数组中搜索任何匹配项,并且从阵列中删除任何不匹配的内容;
string search = textBox1.Text;
for (int i = 0; i < staffUsers.Count; i++)
{
if (!(staffUsers[i].staff_name.Contains(search)))
{
staffUsers.Remove(staffUsers[i]);
}
}
我的阵列中有一些垃圾名字'Rob Dob','Joe Bloggs','h h','ghg hgh',如果搜索变量最终成为'R',Joe Bloggs会被删除但是' hh'和'ghg hgh'呆在那里,但那里根本没有R参与?任何原因&gt;?!
答案 0 :(得分:7)
您必须向后迭代才能从数组中删除。每次删除项目时,阵列都会变小。通过倒退,这个事实并不重要。
string search = textBox1.Text;
for (int i = staffUsers.Count - 1; i >= 0 ; i--)
{
if (!(staffUsers[i].staff_name.Contains(search)))
{
staffUsers.Remove(staffUsers[i]);
}
}
答案 1 :(得分:6)
您的代码的问题在于您在迭代时删除项目。您删除了一个项目,但继续迭代,即使删除项目时数组的大小也会发生变化。
删除内容后,您需要重置i值。或者,您需要使用内置来完成繁重的工作:
staffUsers.RemoveAll(i => !(i.staff_name.Contains(search)));
使用一个小的LINQ表达式来完成工作。删除该谓词匹配的所有项目。 i
表示要将表达式应用于的项目。如果该表达式的计算结果为真,则将其移除。
答案 2 :(得分:1)
长话短说,无论何时删除索引[i]中的项目,都会跳过索引[i + 1]处的项目。例如,如果您的数组如下所示:
{'Joe Bloggs','Rob Dobb','h h','gafddf'}; I = 0
删除位于0位置的Joe Bloggs。
{Rob Dobb','h h','gafddf'}; I = 1
删除'h h',即位置1
{Rob Dobb','gafddf'}; I = 2
我不低于yourArray.Count,所以循环停止。没有位置2.
最快的解决方法是添加i--如果你从index [i]中删除了一些内容。在你的情况下,
staffUsers.Remove(staffUsers[i]);
i--;
希望这有帮助!
答案 3 :(得分:0)
在循环的每次迭代中,删除项目或增加计数器,而不是两个操作。否则,每当删除数组元素时,您都将跳过下一个数组元素:
string search = textBox1.Text;
for (int i = 0; i < staffUsers.Count;)
{
if (!(staffUsers[i].staff_name.Contains(search)))
{
staffUsers.Remove(staffUsers[i]);
}
else
{
i++;
}
}
答案 4 :(得分:0)
string search = textBox1.Text;
for (int i = 0; i < staffUsers.Count; i++)
{
if (!(staffUsers[i].staff_name.Contains(search)))
{
staffUsers.Remove(staffUsers[i]);
// reset the index one stepback
i--;
}
}
答案 5 :(得分:0)
解决上述问题的最简单方法是使用LINQ。 以下代码解开了上述问题。
string search = textBox1.Text;
staffUsers= (from user in staffUsers
where !user.Contains(search)
select user).ToArray<string>();
注意:我假设staffUsers是字符串数组。