C# 使用for从列表中删除节点

C# 使用for从列表中删除节点,c#,list,split,C#,List,Split,以下是我所做的: // this is an example of my function, the string and the remover should be variables string delimeter = ","; string remover="4"; string[] separator = new string[] { "," }; List<String> List = "1,2,3,4,5,6".Split(separator, StringSplitO

以下是我所做的:

// this is an example of my function, the string and the remover should be variables
string delimeter = ",";
string remover="4";
string[] separator = new string[] { "," };
List<String> List = "1,2,3,4,5,6".Split(separator, StringSplitOptions.None).ToList();
for (int i = 0; i < List.Count - 1; i++)
{
    if(List[i]==remover)
        List.RemoveAt(i);
}
string allStrings = (List.Aggregate((i, j) => i + delimeter + j));
return allStrings;
//这是我函数的一个示例,字符串和删除程序应该是变量
字符串delimeter=“,”;
字符串移除器=“4”;
字符串[]分隔符=新字符串[]{“,”};
List List=“1,2,3,4,5,6”.Split(分隔符,StringSplitOptions.None).ToList();
for(int i=0;ii+delimeter+j));
返回所有字符串;
问题是重新运行的字符串与原始字符串相同,与“1,2,3,4,5,6”相同。“4”还在里面

如何修复它

编辑:


解决方案是,我没有检查列表中的最后一个节点,因为在示例中它看起来不像,因为这是我刚才给出的一个示例,当您从这样的列表中删除项时,您应该使for循环反向运行,从最高索引到最低索引


如果你从最低到最高,当项目被移除时,你会将其向下移动,这将跳过项目。以相反的方式运行它没有这个问题。

您的代码会产生预期的输出。运行时,它将返回
1,2,3,5,6
。如果没有,那是由于调用此方法时出现了错误

这并不是说你没有问题

删除某个项目时,仍会增加当前索引,因此在删除任何项目后都会跳过对该项目的检查

虽然有许多解决方案,但这里最好的解决方案是使用
List
RemoveAll
方法。它不仅可以确保对所有项目进行评估,而且可以更有效地进行评估。从列表中删除一个项目意味着将所有项目移动一个
RemoveAll
可以在最后完成所有的转换,如果删除了很多项,效率会更高

另一个错误是,您的
for
循环根本没有检查最后一项

另一方面,您不应该使用
Aggregate
将给定分隔符的一组字符串连接在一起。这是非常低效的,因为在添加第二项时需要将第一项中的所有数据复制到中间字符串中,然后在添加第三项时将这两个数据复制到新字符串中,然后在创建第四项时将这三个数据复制到新字符串中,依此类推。相反,您应该使用
string.Join(delimeter,List)
,不仅效率更高,而且更易于编写,并且在语义上准确地表示您正在尝试执行的操作。双赢

我们现在可以将该方法重新编写为:

string delimeter = ",";
string remover = "4";
List<String> List = "1,2,3,4,5,6"
    .Split(new[] { delimeter }, StringSplitOptions.None).ToList();
List.RemoveAll(n => n == remover);
return string.Join(delimeter, List);
将此用于删除

  list.RemoveAll(f => f==remover);

只是一个旁注:您有
i
,但这不会影响最后一项。这就是你的本意吗?你只犯了一个错误,@Bradley说的..@Silvermind就是这样谢谢你!由于OP的示例没有两个
4
s连成一行,这不会在这里咬到他。这是一个很好的提示,我发现了我的bug,谢谢@Cooper这是一个bug,但并不是导致代码无法运行的bug。我的bug是我没有检查中的最后一个节点,我在示例中没有这样做,因为这是我刚才给出的一个示例,非常感谢。我认为这是问题的解决方案,因为他们的意图是明确的,所有符合特定条件的项目。他使用了一个循环,这是不正确的,因为当你删除一个项目时,列表被改变,其索引变得无效。List类提供了在不使用任何循环的情况下执行此操作的方法。
  list.RemoveAll(f => f==remover);