如何使用LINQ查询嵌套列表中候选人的最高得票及对应信息
解决嵌套选区列表中候选人最高得票数的LINQ查询方案
嘿,我来帮你搞定这个LINQ查询的问题!首先得明确一下类的完整结构——你给的Constituency类里没提候选人列表,我假设它包含候选人集合,同时补充Candidate类的定义(没有这些我们没法关联选区和候选人的得票数据):
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 Name { get; set; } public int Votes { get; set; } // 得票数属性 }
接下来分两种常见场景给你方案:
场景1:直接找全局所有候选人中的最高得票(含并列情况)
这个方案会先把嵌套的候选人列表“拍平”,关联每个候选人所属的选区,然后找出最高得票数,最后筛选出所有达到该票数的候选人及对应选区信息:
// 假设你的ListOfConstituencies实例已经填充了数据 var constituencyData = new ListOfConstituencies(); // 1. 扁平化数据:将每个候选人与所属选区绑定 var allCandidatesWithConstituency = constituencyData.Constituencies .SelectMany(constituency => constituency.Candidates .Select(candidate => new { ConstituencyName = constituency.ConstituencyName, CandidateName = candidate.Name, Votes = candidate.Votes })); // 2. 获取全局最高得票数 int maxTotalVotes = allCandidatesWithConstituency.Max(c => c.Votes); // 3. 筛选出所有得票数等于最高票的结果 var topCandidates = allCandidatesWithConstituency .Where(c => c.Votes == maxTotalVotes) .ToList();
这个方法的优势是高效且直接,不管有多少个候选人并列最高,都能一次性全部获取。
场景2:先找每个选区的最高得票候选人,再从中选全局最高
如果你需要先保留每个选区的最高票候选人信息,再从中筛选全局最高,就用这个方案:
var constituencyData = new ListOfConstituencies(); // 1. 找出每个选区的最高票候选人(排除无候选人的选区) var constituencyTopCandidates = constituencyData.Constituencies .Select(constituency => new { ConstituencyName = constituency.ConstituencyName, TopCandidate = constituency.Candidates.OrderByDescending(c => c.Votes).FirstOrDefault() }) .Where(item => item.TopCandidate != null); // 过滤空候选人的选区 // 2. 获取所有选区最高票中的最大值 int globalMaxVotes = constituencyTopCandidates.Max(item => item.TopCandidate.Votes); // 3. 筛选出全局最高的候选人及对应选区 var globalTopCandidates = constituencyTopCandidates .Where(item => item.TopCandidate.Votes == globalMaxVotes) .Select(item => new { item.ConstituencyName, CandidateName = item.TopCandidate.Name, item.TopCandidate.Votes }) .ToList();
注意事项
- 记得处理空值:如果某个选区没有候选人,
FirstOrDefault会返回null,所以一定要用Where过滤掉这些条目,避免后续Max操作抛出异常。 - 如果你的数据量很大,优先用场景1的方案,因为先取最大值再筛选的效率比排序后取前几名更高。
内容的提问来源于stack exchange,提问作者Dawid Stefaniak
相关产品推荐
相关产品推荐

