【发布时间】:2017-08-19 17:51:45
【问题描述】:
我有一个对象列表。这些对象包含纬度和经度坐标以及其他属性。我只想提取那些满足的坐标
(Math.Abs(elem1.lat - elem2.lat) > Delta && Math.Abs(elem1.lon - elem2.lon) > Delta)
基本上我只想提取坐标不接近的对象。
C# LINQ 有没有一种优雅的方法来做到这一点?
编辑 1:
所以 elem1 和 elem2 是列表中的任意 2 个元素。查询将导致的 I 元素在其中任意 2 个元素之间具有大于 delta 的值
编辑 2:
这是我目前的代码。它可以按我的意愿工作:
for (int i = 0; i < companyHistory.Count; i++)
{
var isOk = true;
var count = zoomApprovedHistory.Count;
for (var j = 0; j < count; j++)
{
if (Math.Abs(companyHistory[i].X - zoomApprovedHistory[j].X) < delta && Math.Abs(companyHistory[i].Y - zoomApprovedHistory[j].Y) < delta)
{
isOk = false;
break;
}
}
// if no other point is close add it to approved array for this zoom
if (isOk)
{
zoomApprovedHistory.Add(companyHistory[i]);
}
}
如何优化它?它具有 O(n^2) 复杂度。寻找最快的选择
【问题讨论】:
-
你的 elem1 和 elem2 是什么?如果这些是列表中的任何两个元素,则您的问题需要改进。想想看;两个对象可能不符合您的标准,但是这两个对象中的一个,比如 elem2,可能符合另一个不同元素的标准。你选 elem2 还是不选?
-
您说“所有元素”,但随后您展示了一个示例,显示了看起来像 2 个不同的元素,请解释更多/更好地说明您想要实现的目标。
-
您的方程式显示了 彼此接近的元素,但您的问题表明您想要 不 的元素。您想要靠近 每个 其他元素的元素、靠近 至少一个 其他元素的元素、远离其他所有元素的元素还是远离其他元素的元素至少还有一个其他元素?
-
假设你有这些 lons
10.0 10.2 10.4 10.6 10.8 11.0具有相同的 lats 和 delta=0.3,你想删除所有项目吗?(项目 n 太靠近项目 n+1) 或10.0 10.4 10.8是一个解决方案吗?或者10.2 10.6 11.0是另一种解决方案吗?还是只满足于10.0 and 11.0?为什么?不清楚你在问什么?