Linq:只为Where和OrderBy调用一次相同的方法,而不是两次

本文关键字:方法 两次 调用 OrderBy 只为 一次 Linq Where | 更新日期: 2023-09-27 17:59:22

我有一个简单的linq查询,我需要过滤一定距离内的存储,并根据距离计算结果排序,你会明白的。

所以,我现在调用了两次GetDistance方法。如何优化代码以使每个商店只调用一次?

double distance = 50;
var result = stores.Where<MyStore>( s =>
                 Helper.GetDistance( lat, lon, s.Lat, s.Lon ) <= distance )
                .OrderBy( s => Helper.GetDistance( lat, lon, s.Lat, s.Lon ) )
                .ToList();

Linq:只为Where和OrderBy调用一次相同的方法,而不是两次

一些人(我)觉得更容易阅读的Yuriy的答案是:

double maxDistance = 50;
var query = from store in stores
             let storeDistance = Helper.GetDistance(lat, lon, store.lat, store.lon)
             where storeDistance < maxDistance
             orderby storeDistance
             select store;
var result = query.ToList();

编译器只是简单地将其翻译成看起来很像Yuriy的代码。

var result = stores.Select(store => 
    new
    {
        distance = 
            StoreHelper.Current.GetDistance(latitude, longitude, store.Latitude.Value, store.Longitude.Value),
        store
    })
    .Where(a => a.distance <= distance)
    .OrderBy(a => a.distance)
    .Select(a => a.store)
    .ToList();