Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何按条件获取组的最大对象(整个对象,而不是其属性)_C#_Linq - Fatal编程技术网

C# 如何按条件获取组的最大对象(整个对象,而不是其属性)

C# 如何按条件获取组的最大对象(整个对象,而不是其属性),c#,linq,C#,Linq,根据某些标准,我希望获得I分组的最大对象,但是到目前为止,我似乎找不到允许我在组中返回整个对象的重载 List<Player> players = new List<Player>() { new Player() { Name = "Peyton Manning", Age = 36, Position = "QB", Salary = 19000000 }, new Player() { Name = "Tom Brady", Age = 35

根据某些标准,我希望获得
I分组的最大对象,但是到目前为止,我似乎找不到允许我在组中返回整个对象的重载

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 },
};
到目前为止,这是我得到的:

var playersGroupedByPosition = players
    .GroupBy(p => p.Position)
    .Select(g => g.Max(p => p.Salary));
但这只会给我一个最高工资的列表(如整数列表)。
Max
似乎没有重载,它允许我从
i分组
返回
Player
对象,而不是
Max()
,后者依赖对象来实现
i可比较

我的LINQ有点弱,所以我还没有想出如何编写子查询来获取组的最大条目并将其返回到外部select,但是有没有更直接的方法来实现这一点


我见过使用第三方库(及其自定义运算符
MaxBy
)引用的解决方案,但我不想走这条路,除非无法使用现有的查询运算符集,否则,我想了解现有运算符的限制,这些运算符阻止在查询中执行此操作。

我认为使用
ToList
OrderBy
可以避免使用第三方代码:

IEnumerable<Player> highestPaidPlayers = players.GroupBy(p => p.Position)
    .Select(g => g.ToList().OrderBy(p => p.Salary).Last());
IEnumerable highestPaidPlayers=players.GroupBy(p=>p.Position)
.Select(g=>g.ToList().OrderBy(p=>p.Salary.Last());
使用嵌套的“子选择”解决方案

表达式语法解决方案:

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;
查询语法解决方案:

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;
试穿一下