ForGeach List forEneric循环无休止地重复

时间:2012-02-16 12:28:42

标签: c# generics

Deserializing只有一条记录的文件后

似乎它处于一个不定式的循环中

IndexSeries = (List<string>)bFormatter.Deserialize(fsSeriesIndexGet);
IndexSeries.ForEach(name => AddSerie(name));
//IndexSeries.ForEach(delegate(String name)
//{
      //    AddSerie(name);
//});

AddSerie将被无限期执行!

2 个答案:

答案 0 :(得分:4)

您使用含糊不清的字词。首先你提到一个无限循环,然后提到AddSerie将被执行'无限'[原文如此];基于此,我认为你提出的问题并不是ForEach永远持续下去(如暗示/陈述),而是AddSerie做了一件似乎是永远地拿走。

这甚至可能相当于Joey提到的内容:如果您在ForEach调用的上下文中将某个元素添加到列表,那么您总是一步到位落后于完成,因此不会“完成”。但是,获得OutOfMemoryException实际上会相对较快地发生,如果,比如说,AddSerie除此之外什么都不做 - 可能需要更长时间才能达到 / em> AddSerie是一种相对耗时的方法。再说一次,你可能永远不会得到这样的例外(在讨论的上下文中)如果 AddSerie只需要一个狗年龄来完成没有贡献长度的列表。

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

答案 1 :(得分:2)

如果我定义:

//class level declaration (in a console app)
static List<string> strings;

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

然后

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

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

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

无限循环,在过程中添加'!'和

static void Main(string[] args)
{
  strings = new List<string> { "sample" };
  foreach (string s in strings)
  {
    Loop(s);
  }
}

抛出InvalidOperationException( Collection被修改;枚举操作可能无法执行),在我看来这是正确的行为。为什么List.ForEach方法允许通过操作更改列表,我不知道,但是想知道:)