Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#for循环删除包含';TJ';只删除包含它的一个字符串_C#_Visual Studio - Fatal编程技术网

C#for循环删除包含';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

我试图创建一个方法,删除所有Sales对象,如果它们的材质描述在字符串中包含“TJ”。我的问题是,当我创建一个包含四个销售(其中两个在描述中包含“TJ”)的列表时,只有一个被删除。被删除的文件不是第一个文件的唯一文件。如果我从第一次销售中删除“TJ”,则第二次销售将被正确删除。为什么会发生这种情况?下面是我的方法和测试用例

/// <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中的内容。

这是因为您在循环期间编辑了列表。一旦删除一项,计数就会发生变化

有两种解决方法-使用其中一种:

  • 按相反顺序循环(List.Count-1到0):

  • 使用Lambdas删除值

    salesList.RemoveAll(s => s.material.Contains("TJ"));
    

  • 这是因为您在循环过程中编辑了列表。一旦删除一项,计数就会发生变化

    有两种解决方法-使用其中一种:

  • 按相反顺序循环(List.Count-1到0):

  • 使用Lambdas删除值

    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是的,可以做一个!简化。