【问题标题】:Comparing list items together condition throws stack overflow exception比较列表项条件会引发堆栈溢出异常
【发布时间】:2018-11-08 19:03:16
【问题描述】:

我有一个节点列表,每个节点都有对其前一个节点和下一个节点的引用。我想要一个不共享下一个或以前的节点的列表。换句话说,未排序的节点列表。

 nodes= nodes.Where(o => !nodes.Any(oo => ReferenceEquals(oo.NextNode, o.PreviousNode)));

抛出这个异常

NodeLib.dll 中出现“System.StackOverflowException”类型的未处理异常

我不知道我错过了什么或误解了什么。提前谢谢!

【问题讨论】:

  • 可能是由枚举器或属性的实现引起的。没有更多信息很难说。
  • 这感觉像是某个地方的递归问题,即您的一个节点正在引用 PreviousNode 引用 PreviousNode ,然后最终引用原始节点。不过,目前只是猜测。
  • @marsze 怎么会这样?如果我错了,请纠正我,但我只是比较节点是否通过引用共享。每次运行程序时,我都会在不同的 dll 中得到异常。它并不总是在NodeLib.dll
  • 你的nodes对象是什么类型的?
  • 发布您的节点类代码以及设置节点列表结构的代码可能会有所帮助

标签: c# linq


【解决方案1】:

我认为您的问题是您比较列表的方式,您想将列表与自身进行比较,请尝试以下操作:

var test = from i in nodes
    from j in nodes.SkipWhile(j => j != i)
    where i != j
    select ReferenceEquals(i.NextNode, j.PreviousNode);

链接 -> Efficient list self compare in LINQ?

【讨论】:

  • 这将返回一个包含一个 Boolean 的列表,仅适用于具有两个节点的列表。
  • 您应该可以通过提供的链接进行相应的修改以获得您想要的结果。您的问题是您正在自我比较列表,当节点未排序时,您选择哪一个? ooo 或两者兼而有之?我建议先使用普通循环并遍历列表本身,然后根据需要修改为 Linq。
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 2012-05-28
  • 1970-01-01
相关资源
最近更新 更多