Lambda / LINQ选择最小值

时间:2014-01-01 04:06:54

标签: c# .net linq lambda linq-to-objects

我正在使用.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,但我不完全确定如何执行这个...任何指针?

3 个答案:

答案 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();