列表中列表的LINQ Max()函数

3

我正在苦恼于LINQ查询。我需要在所有选区(使用选区列表)中查找候选人票数的最高值(Max),并获取选区名称,候选人姓名和票数值。这意味着我需要在两个列表中查找最高值,并选择对象选区(或者至少获取其值)。

public class ListOfConstituencies()
{
    public List<Constituency> Constituencies {get;set;}
}

public class Constituency
{
    public string ConstituencyName {get;set;}
    public List<Candidate> Candidates {get;set;}
}

public class Candidate
{
    public string CandidateName {get;set;}
    public int Votes {get;set;}
}

我尝试了很多解决方案,但是没有一个能够像下面这样适用于我的问题:使用LINQ查询连接两个表并根据两个参数排序 或者 查找List<List<int>>中最大值的Linq表达式


你能提供样本数据和样本输出吗?你的描述有点不清楚。 - Michael Gunter
3个回答

3
你可以使用select many将多个结果合并为一个匿名对象的可枚举类型,其中包含选区和候选人,然后进行排序并获取第一个。
var candidate = Contituencies
.SelectMany(constituency => constituency.Candidates.Select(candidate => 
   new 
   {
     Constituency = constituency, 
     Candidate = candidate
   }))
.OrderByDescending(candidateInfo => candidateInfo.Candidate.Votes).FirstOrDefault();
string constituencyName = candidate.Constituency.ConstituencyName;
string candidatename = candidate.Candidate.CandidateName;
int votes = candidate.Candidate.Votes;

0

你可以使用匿名函数结合orderbydescending来解决这个问题。

var contituencyWithMostVotes = Constituencies
    .Select(c => new
    {
        Contituency = c,
        Candidate = c.Candidates.OrderByDescending(can => can.Votes).First()
    })
    .OrderByDescending(c => c.Candidate.Votes).First();

结果 "contituencyWithMostVotes" 是一个匿名对象,它有2个属性。

  1. 实际的选区对象
  2. 在该选区中获得最多票数的候选人。

您可以从这些属性中检索所有信息。


这并不完全有效,因为最终你会得到一个以下结构的对象列表: { Constituency Candidate; IEnumerable<int> Votes; } - Dan
@Dan,由于排序,查询结果为单个对象。正如我当时指出的那样,在此之后,实际对象以及它所拥有的“投票”是可访问的。 - N_tro_P
对的,它是一个单一对象,但它是错误类型的对象...请阅读我在第一条评论中放置的类定义并查看,您正在输出名为“Candidate”的“Constituency”对象和名为“Votes”的“IEnumerable<int>”对象。我甚至不确定对“IEnumerable”字段进行OrderByDescending操作会做什么。正确的操作是在我的答案中详细说明的SelectMany查询。 - Dan
再仔细看看你的对象...你匿名对象中的Votes变量是什么类型...如果你将"c.Candidates.Select(can => can.Votes)"更改为"c.Candidates.Select(can => can.Votes).Max()",那么它将按照你所描述的方式工作...但仍然无法给出问题所要求的候选人。 - Dan

0
你可以使用 SelectMany() 将嵌套的候选人列表展开并投影到匿名类型中,然后使用 MoreLinqMaxBy() 功能获取得票最多的那个。
var result = constituencies.SelectMany(con => con.Candidates, (con, can) => 
new { Constituency = con, Candidate = can })
.MaxBy(x => x.Candidate.Votes);

我已经了解了它,但不幸的是,在我的解决方案中我不能使用它(这是一个只能使用System.Linq的任务)。 - Dawid Stefaniak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接