【发布时间】:2019-02-03 06:09:16
【问题描述】:
简介
我是一名比利时软件工程师,在一家生产折弯机的公司工作。我现在有一个有趣的问题,我想知道最好的解决方案,性能在我的工作环境中真的很重要。我认为这对其他程序员来说可能也很有趣。
数据
-
我有一个包含一堆“CS3DLine”类类型对象的列表。
List <CS3DLine> ListParallelLines = new List<CS3DLine>(); -
我还有一个自定义方法,它将其中两个对象作为参数,并返回一个布尔值,告诉这两个对象是否相等。
public static bool IsSameLineIn3D(CS3DLine povleft, CS3DLine povright)
通缉
我想获得一个 FilteredListParallelLines,其中相等的 CS3DLines 完全 从列表中过滤掉。
备注
- 在 Internet 上,我找到了使用 Distinct-method 和 IEqualityComparer 的示例(例如,在 dotNetPerls 上的此页面上),但在这些情况下,仅删除了重复项,而不是具有重复项的原件。
- 我知道我也可以尝试迭代解决这个问题,但我担心如果列表包含大量对象,这会导致性能不佳。
【问题讨论】:
-
您需要定义一个
IEqualityComparer<CS3DLine>,它不仅实现了相等性测试,而且还为每个行实例实现了一致的哈希码。然后您将能够使用基于集合的方法来消除欺骗。 -
不管你怎么做,从列表中删除项目对于多线程来说总是很困难的。在测量之前不要担心性能。
-
也许是对多个属性和过滤器的 groupby 计数为 1?也许问题在于该列表已经包含大量对象。使用适当的 IEqualityComparer 并获取 hash 有不接受重复的数据结构。它会精简你的清单
-
如果我理解正确,如果有两个或更多行的实例相等,它们将被 all 丢弃。对吗?
-
确实,@spender,这是正确的。它们应该全部被丢弃。