";包含“;方法没有';它似乎没有按应有的方式工作

本文关键字:工作 方式 包含 quot 方法 | 更新日期: 2023-09-27 18:25:56

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

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 Blogg斯会被删除,但"h h h"answers"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]);
    }
}

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

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

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

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

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

{"Joe Bloggs"、"Rob Dobb"、"h h"、"gaddf"};i=0

删除位于0位置的Joe Bloggs。

{Rob Dobb’、‘h h’、‘gafdf’};i=1

删除位于位置1 的"h h"

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

i不小于你的Array.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++;
    }
}

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

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

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

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--;
    }
}