关于c#:无休止地重复通用列表的ForEach循环

ForEach loop for a Generic List repeated endlessly

Deserializing之后,只有一个记录的文件

好像是在一个不定式的循环里

1
2
3
4
5
6
IndexSeries = (List<string>)bFormatter.Deserialize(fsSeriesIndexGet);
IndexSeries.ForEach(name => AddSerie(name));
//IndexSeries.ForEach(delegate(String name)
//{
      //    AddSerie(name);
//});

AddSerie将无限执行!


你用的是含糊不清的词。首先,你提到一个无限循环,然后提到AddSerie将被无限地执行[sic];基于此,我认为你提出的问题不是ForEach一直持续下去(如暗示/说明的那样),而是AddSerie曾经做过一件似乎会永远持续下去的事情。

这甚至可以归结为Joey提到的一些事情:如果在ForEach调用的上下文中向列表中添加元素,那么在完成过程中您总是落后一步,因此不会"完成"。然而,如果AddSerie只做了一件事,那么得到一个OutOfMemoryException实际上会发生得比较快——如果AddSerie是一种相对耗时的方法,那么达到这一点可能需要更长的时间。同样,如果AddSerie只是用狗的年龄来完成,而不影响列表的长度,那么你可能永远不会得到这样的例外(在讨论的上下文中)。

显示您的AddSerie代码可能对确定实际问题最有帮助。


如果我定义:

1
2
3
4
5
6
7
8
//class level declaration (in a console app)
static List<string> strings;

static void Loop(string s)
{
  Console.WriteLine(s);
  strings.Add(s +"!");
}

然后

1
2
3
4
5
static void Main(string[] args)
{
  strings = new List<string> {"sample" };
  strings.ForEach(s => Console.WriteLine(s));
}

正常执行,输出单个字符串,而

1
2
3
4
5
static void Main(string[] args)
{
  strings = new List<string> {"sample" };
  strings.ForEach(s => Loop(s));
}

无限循环,添加"!"正在进行中,并且

1
2
3
4
5
6
7
8
static void Main(string[] args)
{
  strings = new List<string> {"sample" };
  foreach (string s in strings)
  {
    Loop(s);
  }
}

引发InvalidOperationException(集合已修改;枚举操作可能无法执行),我认为这是正确的行为。我不知道为什么List.ForEach方法允许列表被操作更改,但我想知道:)