关于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,它做什么?
  • AddSerie是否可能在IndexSeries中增加一个条目?
  • 这里没关系,只有一条记录,我希望该方法只执行一次,这个foreach循环为什么要无限地继续?
  • 即使是这样,它也应该很快遇到内存不足的异常,当然,除非addserie需要很长时间才能执行。
  • @乔伊,是的,我想你们都把问题指给我看了,谢谢,我会检查的,可能有问题。
  • @用户1096…如果您进行小的分配,拥有64位操作系统和大量的磁盘空间,那么很难达到内存不足的异常。
  • var list=new list1 list.foreach(i=>list.add(i));//在一个64位操作系统和3GB内存的机器上,在一秒钟内命中内存不足
  • +1.感谢所有参与的朋友。


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

这甚至可以归结为Joey提到的一些事情:如果在ForEach调用的上下文中向列表中添加元素,那么在完成过程中您总是落后一步,因此不会"完成"。然而,如果AddSerie只做了一件事,那么得到一个OutOfMemoryException实际上会发生得比较快——如果AddSerie是一种相对耗时的方法,那么达到这一点可能需要更长的时间。同样,如果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方法允许列表被操作更改,但我想知道:)

  • 我没有看过代码,但大概它没有使用GetEnumerator,而是手动迭代。
  • 再次感谢,不应该有任何真正的问题,只是一个愚蠢的错误,还要感谢您提供的有用信息
  • 我单独问了一个问题:stackoverflow.com/questions/9311730/&hellip;
  • 起初我认为这应该是我的错误,但这是一个棘手的部分,也许是一个真正有问题的部分,为你的问题高兴,你继续这个问题。