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);

现在,我知道这是伪代码。但它完美地描述了它!

当然,在多个语句中,这很简单。

只是想知道这是否可以在一个语句中而不会破坏可读性。

提前谢谢你。我知道你们中的一些人喜欢查询问题!

Lambda Max and Max and Max

你不能有多个最大值或最小值,这没有意义。您需要某种启发式方法,例如:

   .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 查询中检索各种最大值和最小值会变得非常混乱,我不确定效率是否有任何优势。