C# “Contains”方法似乎没有按它应该的方式工作

C# “Contains”方法似乎没有按它应该的方式工作,c#,contains,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]); } } 在我的数组“Rob Dob

我试图看看当用户输入一些文本时,它是否会在数组中搜索任何匹配项,而不匹配项是否会从数组中删除

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将被删除,但“h h”和“ghg hgh”保留在那里,但那里根本没有R?有什么原因吗

必须向后迭代才能从数组中删除。每次删除项目时,数组都会变小。通过倒退,这一事实并不重要

string search = textBox1.Text;

for (int i = staffUsers.Count - 1; i >= 0 ; i--)
{
    if (!(staffUsers[i].staff_name.Contains(search)))
    {
        staffUsers.Remove(staffUsers[i]);
    }
}

为了从数组中删除,必须向后迭代。每次删除项目时,数组都会变小。通过倒退,这一事实并不重要

string search = textBox1.Text;

for (int i = staffUsers.Count - 1; i >= 0 ; i--)
{
    if (!(staffUsers[i].staff_name.Contains(search)))
    {
        staffUsers.Remove(staffUsers[i]);
    }
}

代码的问题是在迭代时删除了项。您删除了一个项,但仍会继续迭代,即使删除项时数组的大小会发生变化

删除某些内容后,需要重置i值。或者,您需要使用内置的来进行重载:

staffUsers.RemoveAll(i => !(i.staff_name.Contains(search))); 

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

代码的问题在于,在迭代过程中删除了项。您删除了一个项,但仍会继续迭代,即使删除项时数组的大小会发生变化

删除某些内容后,需要重置i值。或者,您需要使用内置的来进行重载:

staffUsers.RemoveAll(i => !(i.staff_name.Contains(search))); 

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

长话短说,无论何时删除索引[i]处的项,都会跳过索引[i+1]处的项。例如,如果阵列看起来像:

{'Joe Bloggs','Rob Dobb','h h','Gafdf'};i=0

移除位于位置0的Joe Bloggs

{Rob Dobb',h h',gafddf'};i=1

拆下位置1处的“h”

{Rob Dobb','gafddf'};i=2

i不小于yourArray.Count,因此循环停止。没有位置2

最快的修复方法是添加i-如果您从索引[i]中删除了某些内容。就你而言

staffUsers.Remove(staffUsers[i]);
i--;

希望这有帮助

长话短说,无论何时删除索引[i]处的项目,都会跳过索引[i+1]处的项目。例如,如果阵列看起来像:

{'Joe Bloggs','Rob Dobb','h h','Gafdf'};i=0

移除位于位置0的Joe Bloggs

{Rob Dobb',h h',gafddf'};i=1

拆下位置1处的“h”

{Rob Dobb','gafddf'};i=2

i不小于yourArray.Count,因此循环停止。没有位置2

最快的修复方法是添加i-如果您从索引[i]中删除了某些内容。就你而言

staffUsers.Remove(staffUsers[i]);
i--;

希望这有帮助

在循环的每次迭代中,要么删除一个项,要么增加计数器,而不是两个操作。否则,无论何时删除数组元素,都将跳过下一个数组元素:

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

在循环的每个迭代中,要么删除一个项,要么增加计数器,而不是两个操作。否则,无论何时删除数组元素,都将跳过下一个数组元素:

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

解决上述问题的最简单方法是使用LINQ。 下面的代码解开了上述问题

string search = textBox1.Text;
staffUsers= (from user in staffUsers
            where !user.Contains(search)
            select user).ToArray<string>();

注意:我假设staffUsers是字符串数组。

解决上述问题的最简单方法是使用LINQ。 下面的代码解开了上述问题

string search = textBox1.Text;
staffUsers= (from user in staffUsers
            where !user.Contains(search)
            select user).ToArray<string>();

注意:我假设staffUsers是字符串数组。

staffUsers的类型是什么?staffUsers的类型是什么?argghh!!!我就知道事情会变得如此微不足道!谢谢马特和所有其他人。啊哈!!!我就知道事情会变得如此微不足道!谢谢马特和所有其他人。