"包含"方法似乎没有按照它应该的方式工作

r0b*_*077 1 c# contains

我试图看看当用户输入一些文本时,它会在数组中搜索任何匹配项,并且从数组中删除任何不匹配的内容;

string search = textBox1.Text;
for (int i = 0; i < staffUsers.Count; i++)
{
    if (!(staffUsers[i].staff_name.Contains(search)))
    {
        staffUsers.Remove(staffUsers[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的阵列中有一些垃圾名称'Rob Dob','Joe Bloggs','h h','ghg hgh',如果搜索变量最终成为'R',Joe Bloggs会被删除但是'hh'和'ghg hgh'留在那里,但那里根本没有R参与?任何理由>?!

Mat*_*ira 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]);
    }
}
Run Code Online (Sandbox Code Playgroud)


deb*_*cey 6

您的代码的问题在于您在迭代时删除项目.您删除项目,但继续迭代,即使删除项目时数组的大小发生更改.

删除后,您需要重置i值.或者,您需要使用内置来完成繁重的工作:

staffUsers.RemoveAll(i => !(i.staff_name.Contains(search))); 
Run Code Online (Sandbox Code Playgroud)

使用一个小的LINQ表达式来完成工作.删除该谓词匹配的所有项目.i表示要将表达式应用于的项目.如果该表达式的计算结果为true,那么它就会消失.