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!!!我就知道事情会变得如此微不足道!谢谢马特和所有其他人。啊哈!!!我就知道事情会变得如此微不足道!谢谢马特和所有其他人。