3

迅速でおそらく簡単なラムダの質問:

レビューのあるレストランがあります。次のようなものをクエリしたい:

  • Max(AverageRating)
  • そしてMax(ReviewCount)
  • そしてMax(NewestReviewDate)
  • そしてMin(DistanceAway)

このようなもの:

var _Result = AllRestaurants
    .Max(x => x.AverageRating)
    .AndMax(x => x.ReviewCount)
    .AndMax(x => x.NewestReviewDate)
    .AndMin(x => x.DistanceAway);

今、私はそれが擬似コードであることを知っています。しかし、それはそれを完璧に説明しています!

もちろん、複数のステートメントでは、これは単純です。

読みやすさを損なうことなく、これが1つのステートメントで可能かどうか疑問に思っています。

前もって感謝します。クエリの質問が気に入っている方もいらっしゃると思います。

4

5 に答える 5

6

おそらくこれでいいのでしょうか?

var bestRestaurant = AllRestaurants
    .OrderByDescending(r => r.AverageRating)
    .ThenByDescending(r => r.ReviewCount)
    .ThenByDescending(r => r.NewestReviewCount)
    .ThenBy(r => r.DistanceAway)
    .FirstOrDefault();

どちらが最も重要かを反映するために、ステートメントの順序を変更する必要があります。

于 2012-06-11T19:38:17.960 に答える
6

複数の最大値または最小値を持つことはできませんが、それは意味がありません。次のようなヒューリスティックが必要になります。

   .Max(x => x.AverageRating * x.ReviewCount - x.DaysSinceLastReview - x.DistanceAway)
于 2012-06-11T19:30:37.317 に答える
1

加重ヒューリスティックを使用する代わりに、AverageRating、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
于 2012-06-11T19:42:54.590 に答える
0

私があなたの質問を理解しているなら、あなたが言うように、最善のアプローチは個々のステートメントを書くことだと思います...

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クエリからさまざまな最大値と最小値を取得すると、かなり面倒になり、効率に利点があるかどうかもわかりません。

于 2012-06-11T19:39:02.907 に答える
0

このようなことを考えてください...

List<RestaurantRecord> _Restaurants;

public RestaurantRecord Best()
{
    return _Restaurants.Where(
               x =>
                   x.AverageRating >= _BestRating &&
                   x.ReviewCount >= _MinReviews &&
                   x.Distance <= _MaxDistance)
                       .GetFirstOrDefault();
}

そうは言っても、この場合にラムダを使用すると、将来的に保守性に影響があります。これをリファクタリングして、将来的に他の基準が表示された場合(たとえば、スマートフォンへのアクセス?料理の種類?)、それらに適応するようにアプリをより簡単に変更できるようにすることをお勧めします。

その点で、少し良い実装は次のようになるかもしれません:

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

これがあなたを正しい軌道に乗せることを願っています。:)

于 2012-06-11T19:40:38.240 に答える