C#for循环删除包含';TJ';只删除包含它的一个字符串
我试图创建一个方法,删除所有Sales对象,如果它们的材质描述在字符串中包含“TJ”。我的问题是,当我创建一个包含四个销售(其中两个在描述中包含“TJ”)的列表时,只有一个被删除。被删除的文件不是第一个文件的唯一文件。如果我从第一次销售中删除“TJ”,则第二次销售将被正确删除。为什么会发生这种情况?下面是我的方法和测试用例C#for循环删除包含';TJ';只删除包含它的一个字符串,c#,visual-studio,C#,Visual Studio,我试图创建一个方法,删除所有Sales对象,如果它们的材质描述在字符串中包含“TJ”。我的问题是,当我创建一个包含四个销售(其中两个在描述中包含“TJ”)的列表时,只有一个被删除。被删除的文件不是第一个文件的唯一文件。如果我从第一次销售中删除“TJ”,则第二次销售将被正确删除。为什么会发生这种情况?下面是我的方法和测试用例 /// <summary> /// This method deletes all sales with a 'TJ' material. /// </s
/// <summary>
/// This method deletes all sales with a 'TJ' material.
/// </summary>
public void deleteTJ()
{
for (int i = 0; i < salesList.Count; i++)
{
if (salesList[i].material.Contains("TJ"))
{
salesList.Remove(salesList[i]);
Console.WriteLine("FOUND IT");
}
else
{
Console.WriteLine("Not this time");
}
}
}
[TestMethod]
public void TestDeleteTJ()
{
sale1.material = "ABJFSJTJ"; // Contains TJ
sale2.material = "KTJANDKFH"; // Contains TJ
sale3.material = "SADVUAWDJ"; // No TJ
sale4.material = "JTNDBAYK"; // No TJ
testList.Add(sale1);
testList.Add(sale2);
testList.Add(sale3);
testList.Add(sale4);
Modifier modifier = new Modifier(testList);
Assert.IsTrue(testList.Count == 4);
modifier.deleteTJ();
Assert.IsTrue(testList.Count == 2);
Assert.AreEqual("SADVUAWDJ", testList[0]);
Assert.AreEqual("JTNDBAYK", testList[1]);
}
//
///此方法删除具有“TJ”物料的所有销售。
///
公共无效删除tj()
{
for(int i=0;i
从列表中删除项目时,所有后续索引都会递减
0: ABJFSJTJ
1: KTJANDKFH
2: SADVUAWDJ
3: JTNDBAYK
删除第一个索引时,列表现在如下所示:
0: KTJANDKFH
1: SADVUAWDJ
2: JTNDBAYK
然后循环将
i
增加到1,有效地跳过了以前在索引1中的内容。当您从列表中删除一个项目时,所有后续索引都会减少
0: ABJFSJTJ
1: KTJANDKFH
2: SADVUAWDJ
3: JTNDBAYK
删除第一个索引时,列表现在如下所示:
0: KTJANDKFH
1: SADVUAWDJ
2: JTNDBAYK
然后循环将
i
增加到1,有效地跳过了以前在索引1中的内容。这是因为您在循环期间编辑了列表。一旦删除一项,计数就会发生变化
有两种解决方法-使用其中一种:
salesList.RemoveAll(s => s.material.Contains("TJ"));
这是因为您在循环过程中编辑了列表。一旦删除一项,计数就会发生变化 有两种解决方法-使用其中一种:
salesList.RemoveAll(s => s.material.Contains("TJ"));
你的问题源于你的循环
for(int index = 0; index < collection.Count; index++)
if(collection[index].Contains("TJ")
collection.Remove(...)
例3:
var filter = collection.RemoveAll(item => item.Material.Contains("TJ");
你的问题源于你的循环
for(int index = 0; index < collection.Count; index++)
if(collection[index].Contains("TJ")
collection.Remove(...)
例3:
var filter = collection.RemoveAll(item => item.Material.Contains("TJ");
您是否尝试过通过代码进行调试,查看每次考虑的内容?提示:从列表中删除元素0后,您认为KTJANDKFH有什么索引?仅向后删除第一个occurenceLoop以避免索引问题。您是否尝试过通过代码进行调试,查看每次考虑的内容?提示:从列表中删除元素0后,您认为KTJANDKFH有什么索引?只向后删除第一个occurenceLoop以避免索引问题。为什么不
false==(item.Contains(“TJ”)==true)
?@EdPlunkett是的,可以做一个!为了简化。为什么不false==(item.Contains(“TJ”)==true)
?@EdPlunkett是的,可以做一个!简化。