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

时间:2012-02-28 02:18:00

标签: 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','Joe Bloggs','h h','ghg hgh',如果搜索变量最终成为'R',Joe Bloggs会被删除但是' hh'和'ghg hgh'呆在那里,但那里根本没有R参与?任何原因&gt;?!

6 个答案:

答案 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是字符串数组。