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

C# 如何使用LINQ从一组中挑选最佳表演者,c#,linq,C#,Linq,给定一组var-battingContribution=IQueryable(基本上是球员及其总击球分数的列表)和另一组var-bowlingContribution=IQueryable,我如何选择谁的净贡献率最好,从而使击球得分减去保龄球得分的球员的净贡献率最高?以下内容仅适用于两种贡献率的球员(尽管我不知道有两个类型参数的IQueryable): 有关Linq样本的MSDN参考,请参见 编辑-根据OP的完整性评论: var BestPlayer = (from a in (from bt

给定一组
var-battingContribution=IQueryable
(基本上是球员及其总击球分数的列表)和另一组
var-bowlingContribution=IQueryable
,我如何选择谁的净贡献率最好,从而使击球得分减去保龄球得分的球员的净贡献率最高?

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

有关Linq样本的MSDN参考,请参见

编辑-根据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();

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

有关Linq样本的MSDN参考,请参见

编辑-根据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();

假设您有
IDictionary
而不是
IQueryable
(没有两个类型参数):


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

假设您使用的是
IDictionary
,而不是
IQueryable
(没有两个类型参数):


如果愿意的话,可以将它们链接在一起以简洁。

没有接受两个类型参数的
IQueryable
。你到底在用什么?@DanielHilgarth:
IDictionary
可能吧。它实际上是一种匿名类型。我只是在上面扔了一些伪代码来表达我的观点。我想我可以使用字典,但我还没有达到优化代码的程度;只是尝试获取结果。没有接受两个类型参数的
IQueryable
。你到底在用什么?@DanielHilgarth:
IDictionary
可能吧。它实际上是一种匿名类型。我只是在上面扔了一些伪代码来表达我的观点。我想我可以使用字典,但我还没有达到优化代码的程度;只是想得到结果。稍微编辑一下您提供的内容:
var BestPlayer=(从a in开始(从batRuns中的bt开始,从bowlRuns中的bw开始,其中bt.Player==bw.Player选择新的{Player=bt.Player,Diff=bt.Runs-bw.Runs})orderby a.Diff降序选择a.First()但这绝对有效!对您提供的内容稍加编辑:
var BestPlayer=(从a in开始(从bt in batRuns开始从bw in bowlRuns开始,其中bt.Player==bw.Player选择新的{Player=bt.Player,Diff=bt.Runs-bw.Runs})orderby a.Diff降序选择a.First()但这绝对有效!
// 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;