我正在使用.NET GeoCoordinate
类编写函数。我们有一个Airport
类和一个City
类,它们都定义了自己的GeoCoordinate
。
我需要选择最近的机场相对于城市,我正在尝试使用GetDistanceTo()
方法。
我现在拥有的内容如下:
Airport a = Airports.GetAllActiveAirports().Min(this.Coordinates.GetDistanceTo(n.Profile.Coordinates));
按距离检索最近机场列表的另一个(工作)功能使用:
List<Airports> airports = Airports.GetAllActiveAirports();
var nearby =
from a in airports
where this.Coordinates.GetDistanceTo(a.Profile.Coordinates) > d
select a;
foreach(Airport a in nearby)
{
airports.Remove(a);
}
我已经看到过使用LINQ&amp; amp; lambdas,但我不完全确定如何执行这个...任何指针?
答案 0 :(得分:6)
如果我收到您的问题,此行将获得从坐标到活动机场的最小距离。
Airports.GetAllActiveAirports().Min(_ => Coordinates.GetDistanceTo(_.Profile.Coordinates))
如果您想要有问题的机场:
var airports = Airports.GetAllActiveAirports();
var closest = airports.First(_ => Coordinates.GetDistanceTo(_.Profile.Coordinates) == airports.Min(_ => Coordinates.GetDistanceTo(_.Profile.Coordinates)))
您不必将其保留在一行中...... Visual Studio不会用完空间。
更好的选择是,在每次迭代中都没有得到最小值:
var airports = Airports.GetAllActiveAirports();
var minDistance = airports.Min(_ => Coordinates.GetDistanceTo(_.Profile.Coordinates))
var closest = airports.First(_ => Coordinates.GetDistanceTo(_.Profile.Coordinates) == minDistance)
答案 1 :(得分:4)
接受的答案会导致每个机场拨打GetDistance
2个电话。以下是一次通过的方法:
var closestAirport = Airports.GetAllActiveAirports()
.Select(x => new {
Airport = x,
Distance = this.Coordinates.GetDistanceTo(x.Profile.Coordinates)})
.Aggregate((a1, a2) => a1.Distance < a2.Distance ? a1 : a2)
.Airport;
答案 2 :(得分:1)
Min将抛出InvalidOperationException
。你可能会尝试这样的事情。如果没有找到,则最接近的将为null:
var closest = Airports.GetAllActiveAirports().OrderBy(x => x.GetDistanceTo(n.Profile.Coordinates)).FirstOrDefault();