【问题标题】:Lambda/LINQ Select MinimumLambda/LINQ 选择最小值
【发布时间】:2014-01-01 04:06:54
【问题描述】:

我正在使用 .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 和 lambda 在一行中执行此类操作的示例,但我不完全确定如何执行此操作...任何指针?

【问题讨论】:

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


    【解决方案1】:

    如果我收到您的问题,这条线将获取从坐标到活动机场的最短距离。

    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)
    

    【讨论】:

    • 正确。它应该返回具有最小/最小距离的对象......它正在City 对象上执行,尽管我认为这会让我绊倒。
    • 有趣的是,您的问题是关于机场的,而您的声誉是 747。
    • 确实哈哈...甚至没有注意到它。所以基本上我们正在检查从GetDistanceTo 返回的值是否等于 Min,如果是则返回对象?
    • 我已经用 foreach 完成了...这比什么都更适合学习因素
    • @mike 你绝对应该使用最后一个选项:在closest 查询之前计算minDistance。这种方式最多可以拨打2*n GetDistanceTo() 电话,而MinFirst 内的电话最多可以接n*(n+1) 电话!
    【解决方案2】:

    接受的答案会导致每个机场向 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;
    

    【讨论】:

      【解决方案3】:

      如果没有值,Min 将抛出 InvalidOperationException。你可能会尝试这样的事情。如果没有找到,最接近的将为空:

      var closest = Airports.GetAllActiveAirports().OrderBy(x => x.GetDistanceTo(n.Profile.Coordinates)).FirstOrDefault();
      

      【讨论】:

      • FirstOrDefault 不在正确的位置。它将在一个机场运行。
      • 它甚至不会编译,除非Airport 实现IEnumerable&lt;Something&gt;
      • 另外,orderBy 更重且不必要,因为它会订购 所有 个项目,而不仅仅是第一个
      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多