【问题标题】:ForEach loop for a Generic List repeated endlessly通用列表的 ForEach 循环无休止地重复
【发布时间】:2012-03-07 20:24:55
【问题描述】:

Deserializing 之后只有一条记录的文件

好像是在不定式循环中

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

AddSerie 将不定式执行!

【问题讨论】:

  • 什么是AddSerie,它有什么作用?
  • AddSerie 是否可能向IndexSeries 添加条目?
  • 这里没关系,只有一条记录,我希望该方法只执行一次,这个foreach循环为什么会无休止地继续?
  • @user1096... 如果您进行少量分配、拥有 64 位操作系统和大量磁盘空间,则很难遇到 OutOfMemory 异常。
  • var list = new List { 1 }; list.ForEach(i => list.Add(i)); //在 64 位操作系统和 3gb 内存的机器上一秒钟内内存不足

标签: c# generics


【解决方案1】:

您使用了模棱两可的术语。首先你提到了一个无限循环,然后提到AddSerie 将被“无限地”执行[原文如此];基于此,我认为您提出的问题不是ForEach 一直持续下去(如暗示/说明的那样),而是AddSerie 做了一些似乎永远持续下去的事情。

这甚至可能相当于 Joey 提到的一些事情:如果您在 ForEach 调用的上下文中向列表添加元素while,那么您总是落后一步完成,因此不会“完成”。然而,获得OutOfMemoryException 实际上会相对较快地发生if,比如说,AddSerie 除了这样做 - 可能需要更长的时间才能达到这样的程度if @ 987654327@是一种比较耗时的方法。再说一次,你可能永远不会遇到这样的异常(在所讨论的上下文中)如果 AddSerie 只是需要一个狗的年龄来完成而不影响列表的长度。

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

【讨论】:

  • 所有参与的朋友都是对的,Joey 的问题类型让我想起了我在 AddSerie 中所做的一件事情,导致集合总是有加一项,并且这个过程将继续下去。跨度>
【解决方案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(集合已修改;枚举操作可能无法执行),在我看来这是正确的行为。为什么List.ForEach 方法允许通过动作改变列表,我不知道,但想知道:)

【讨论】:

  • 我没有看代码,但推测它没有使用GetEnumerator而是手动迭代。
  • 再次感谢,不应该有任何真正的问题,只是一个愚蠢的错误,也感谢您提供的有用信息
  • 我已将这种行为作为一个单独的问题询问:stackoverflow.com/questions/9311730/…
  • 起初我认为这应该是我的错误,但这是一个棘手的部分,也许是一个真正有问题的部分,很高兴你继续这个问题
猜你喜欢
  • 2020-01-24
  • 2021-10-23
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
相关资源
最近更新 更多