我如何使用LINQ从一组中挑选最佳表演者?

本文关键字:一组 挑选 最佳 表演者 何使用 LINQ | 更新日期: 2023-09-27 18:08:27

给定一组var battingContribution = IQueryable<Player, Runs>(基本上是球员和他们的总击球分数的列表)和另一组var bowlingContribution = IQueryable<Player, Runs>,我如何选择谁的净贡献是最好的,这样球员的击球分数减去保龄球分数的结果是最高的净总数?

我如何使用LINQ从一组中挑选最佳表演者?

假设您有IDictionary<Player, Runs>而不是IQueryable(没有两个类型参数):

// Just to make sure that we don't get exceptions if a player is only in one
// of the two collections -- you might want to handle this case differently
var players = battingContribution.Keys.Intersect(bowlingContribution.Keys);
// Put each player and their performance into what is essentialy a tuple
var performance = players.Select(p => 
    new {
        Player = p,
        Performance = battingContribution[p] - bowlingContribution[p]
    });
// Sorting
var orderedPerformance = performance.OrderByDescending(item => item.Performance);
// Selecting best performer
var bestPerformer = orderedPerformance.First().Player;

如果您愿意,可以将它们链接在一起以保持简洁。

以下内容仅适用于两个贡献中的Players(尽管我不知道有两个类型参数的IQueryable):

var BestPlayer = (from a in (from bt in battingContribution from bw in BowlingContribution where bt.Player == bw.Player select new { Player = bt.Player, Diff = bt.Runs - bw.Runs)) orderby a.Diff descending select a).First().Player;

Linq示例的MSDN参考参见http://msdn.microsoft.com/en-us/vcsharp/aa336746


编辑-根据OP的评论来完成:
var BestPlayer = (from a in (from bt in batRuns from bw in bowlRuns where bt.Player == bw.Player select new { Player = bt.Player, Diff = bt.Runs - bw.Runs}) orderby a.Diff descending select a).First();