3

の最大のオブジェクトをいくつかの基準で取得したいのですが、IGroupingこれまでのところ、グループ内のオブジェクト全体を返すことを可能にするオーバーロードが見つからないようです

List<Player> players = new List<Player>() 
{ 
     new Player() { Name = "Peyton Manning", Age = 36, Position = "QB", Salary = 19000000 },
     new Player() { Name = "Tom Brady", Age = 35, Position = "QB", Salary = 18400000 },
     new Player() { Name = "Drew Brees", Age = 34, Position = "QB", Salary = 21000000 },
     new Player() { Name = "Randy Moss", Age = 35, Position = "WR", Salary = 7000000 },
     new Player() { Name = "Marvin Harrison", Age = 38, Position = "WR", Salary = 11000000 },
     new Player() { Name = "Demaryius Thomas", Age = 23, Position = "WR", Salary = 5000000 },
     new Player() { Name = "Ryan Clady", Age = 26, Position = "OT", Salary = 10000000 },
};

次のように列挙できる結果セットを返すクエリを書きたいと思います。

foreach(Player player in highestPaidPlayers) 
{
      Console.WriteLine("The highest paid {0} is {1}, who is being paid {2}", player.Position, player.Name, player.Salary);
}

これまでのところ、これは私が得た限りです:

var playersGroupedByPosition = players
    .GroupBy(p => p.Position)
    .Select(g => g.Max(p => p.Salary));

しかし、これは最高の給与のリスト (整数のリストなど) しか得られません。実装するオブジェクトに依存する以外のからオブジェクトをMax返せるようにするためのオーバーロードはないようです。PlayerIGroupingMax()IComparable

私の LINQ は少し弱いので、サブクエリを記述してグループの最大エントリを取得し、それを外部選択に返す方法を理解していませんが、これを行うより簡単な方法はありますか?

サードパーティのライブラリMoreLINQ (およびそのカスタム operator MaxBy) を使用して参照するソリューションを見てきましたが、既存の一連のクエリ演算子を使用できない場合を除き、(まだ)そのルートに行きたくありません。そうでない場合は、これをクエリで実行できないようにする既存の演算子の制限を理解したいと思います。

4

2 に答える 2

4

サードパーティのコードの使用を避けることができるToListと思います:OrderBy

IEnumerable<Player> highestPaidPlayers = players.GroupBy(p => p.Position)
    .Select(g => g.ToList().OrderBy(p => p.Salary).Last());
于 2013-02-10T17:46:45.943 に答える
2

ネストされた「サブセレクト」を使用したソリューション

式構文ソリューション:

var highestPaidPlayers = players.GroupBy(p => p.Position)
                                 .Select(x => x.Where(p => p.Salary == x.Max(m => m.Salary)).First());

クエリ構文ソリューション:

var highestPaidPlayers = from pl in players
                         group pl by pl.Position
                         into g
                             let max = g.Max(x => x.Salary)
                             let maxPl = g.Where(x => x.Salary == max).First()
                             select maxPl;

イデオネを試着。

于 2013-02-10T22:20:45.037 に答える