【发布时间】:2014-10-30 23:31:04
【问题描述】:
希望是一个快速的问题。我有一个 Position 类型的 IEnumerable,其中 Position 定义如下:
public class Position {
public double Latitude { get; set; }
public double Longitude { get; set; }
}
我需要做的是快速排序 IEnumerable 以找到落在彼此一定距离内的元素。 IEnumerable 中的元素不会以任何特定顺序填充,但在任何时候我都需要能够计算 IEnumerable 的哪些成员彼此相距 x 公里。
现在,我已经有了一个 Haversine 实现,为了论证,我们可以说它称为 GetDistance 并具有以下签名:
double GetDistance(Position one, Position two);
我有一些想法,但我觉得没有一个特别有效。提供更多信息,IEnumerable 在任何时候都不太可能容纳超过 10,000 个项目。
我想要达到的是一些东西,也许是一个扩展方法,它让我调用它来返回一个 IEnumerable,它只包含原始集合中符合条件的子集,例如:
OriginalEnumerable.GetMembersCloserThan(kilometers: 100);
任何帮助,非常感谢。
编辑:为清楚起见,考虑我要搜索的 IEnumerable 描述了一个半径为 r 的圆。它的成员是圈内的坐标。我正在尝试确定哪些成员(点)在给定的距离范围内。
【问题讨论】:
-
那么
OriginalEnumerable.GetMembersCloserThan(kilometers: 100);会得到距离至少 1 个其他Position对象 100 公里以内的Position对象吗? -
如果您有一个比较两个位置的
GetDistance方法,为什么不简单地自己创建所需的扩展方法呢?有什么问题? -
@SamIam 是的,其想法是 GetMembersCloserThan()... 方法的返回值将返回彼此相距 x 公里范围内的成员。
-
@BenRobinson 尝试了很多,但我想出的最好的方法是嵌套 for-each 循环,效率很低。
-
@Richard
within x kilometers of eachother模棱两可。以您有 4 个元素的情况为例,每个元素都分成对。每对距离它们中的另一个元素只有 1 公里,但它们之间的距离大约为 200 公里。在这种情况下,您要选择所有元素吗?还是一个都没有?