Lambda Max and Max and Max
本文关键字:Max and Lambda | 更新日期: 2023-09-27 18:36:54
快速且可能简单的 Lambda 问题:
我有一家有评论的餐厅。我想查询一个:
- 最大(平均评分)
- 和最大(评论计数)
- 和最大(最新审查日期)
- 和最小(距离)
像这样:
var _Result = AllRestaurants
.Max(x => x.AverageRating)
.AndMax(x => x.ReviewCount)
.AndMax(x => x.NewestReviewDate)
.AndMin(x => x.DistanceAway);
现在,我知道这是伪代码。但它完美地描述了它!
当然,在多个语句中,这很简单。
只是想知道这是否可以在一个语句中而不会破坏可读性。
提前谢谢你。我知道你们中的一些人喜欢查询问题!
你不能有多个最大值或最小值,这没有意义。您需要某种启发式方法,例如:
.Max(x => x.AverageRating * x.ReviewCount - x.DaysSinceLastReview - x.DistanceAway)
也许这样就可以了?
var bestRestaurant = AllRestaurants
.OrderByDescending(r => r.AverageRating)
.ThenByDescending(r => r.ReviewCount)
.ThenByDescending(r => r.NewestReviewCount)
.ThenBy(r => r.DistanceAway)
.FirstOrDefault();
您需要更改语句的顺序以反映哪个是最重要的。
使用一些加权启发式方法的另一种方法是按平均评级排序,然后按 ReviewCount,然后......
这样的事情应该有效:
var _Result = AllRestaurants
.OrderByDescending(x => x.AverageRating)
.ThenByDescending(x => x.ReviewCount)
.ThenByDescending(x => x.NewestReviewDate)
.ThenByDescending(x => x.DistanceAway);
// using *Descending so you get the higer-valued ones first
考虑这样的事情...
List<RestaurantRecord> _Restaurants;
public RestaurantRecord Best()
{
return _Restaurants.Where(
x =>
x.AverageRating >= _BestRating &&
x.ReviewCount >= _MinReviews &&
x.Distance <= _MaxDistance)
.GetFirstOrDefault();
}
话虽如此,在这种情况下使用 lambda 将在未来产生可维护性后果。 重构这一点是个好主意,这样如果将来出现其他标准(例如:智能手机访问? 菜系类型?),可以更轻松地修改应用以适应这些类型。
在这一点上,稍微好一点的实现可能是这样的:
public RestaurantRecord Best()
{
IQueryable temp = _Restaurants.Clone();
temp = temp.Where( x => x.AverageRating >= _BestRating );
temp = temp.Where( x => x.ReviewCount >= _MinReviews );
// ...snip...
return temp.GetFirstOrDefault();
}
我希望这能让你走上正确的轨道。 :)
如果我理解你的问题,我认为最好的方法是写你提到的个人陈述......
var HighestRating = AllRestaurants.Max(x => x.AverageRating);
var HighestReviewCount = AllRestaurants.Max(x => x.ReviewCount);
var LatestReviewDate = AllRestaurants.Max(x => x.NewestReviewDate);
var ShortestDistanceAway = AllRestaurants.Min(x => x.DistanceAway);
从单个 Linq 查询中检索各种最大值和最小值会变得非常混乱,我不确定效率是否有任何优势。