【问题标题】:Accessing adjacent elements in List.RemoveAll predicate访问 List.RemoveAll 谓词中的相邻元素
【发布时间】:2023-03-07 19:16:01
【问题描述】:

我有一个List 的节点,其中每个节点都有一些坐标。

public class Node
{
    float x,y;
    ....
}
List<Node> myNodeList;

我需要从列表中删除与其相邻节点的距离小于给定阈值的每个节点。 我读了这篇 post 解释如何在迭代集合时从集合中删除元素。

我更喜欢使用RemoveAll 方式,而不是以相反的顺序迭代列表,因为我认为它更干净、更优雅。 我的问题是我需要访问当前项目的相邻元素,以计算距离。

有什么干净的方法可以做到这一点吗?

我需要类似的东西:

myNodeList.RemoveAll(item => DistanceLessThanThreshold (item.Value, nextNode) && DistanceLessThanThreshold (item.Value, prevNode);

这可能吗?

【问题讨论】:

  • 如果太难看,写你自己的扩展方法以保持风格。
  • 这里会有一些极端情况。例如,如果您删除列表中的第 4 项,那么以前的第 5 项现在是第 4 项。这个新的第 4 项应该像以前一样使用第 3 项,还是应该使用删除的第 4 项?我不是要解决你的问题,我只是提出这个事实,因为你的帖子不涉及这样的事情,所以别人的解决方案可能不是你的解决方案。
  • @seth flowers:是的,我知道边缘情况。我只是想知道是否有办法在迭代时访问相邻元素。我觉得会很好。
  • 维护两个列表是否可行,一个包含迭代数据,第二个包含操作结果?这样您就不会修改迭代列表。
  • @Justin Skiles:嗯,我知道该怎么做。但是我的问题是在迭代时明确地重新访问相邻元素。我知道如何以其他方式做到这一点(实际上,我已经做到了)。

标签: c# collections predicate


【解决方案1】:

您可以使用反向 where 并通过编写扩展方法 removewhere 来创建新列表,而不是在迭代时删除 -

linq remove item from object array where property equals value

当然,如果可以接受创建新列表 - 取决于列表的大小!

【讨论】:

    猜你喜欢
    • 2020-06-22
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 2019-03-29
    • 1970-01-01
    相关资源
    最近更新 更多