如何基于LINQ GroupBy按属性拆分List并获取单个属性值的子列表
指定答题人答案列表的实现方案
结合你现有基于quemRespondeu字段做分组的逻辑,有两种适配不同场景的实现方式:
方式1:基于已有分组逻辑提取目标数据(适合需要反复查询多用户数据的场景)
如果你已经完成全量数据分组,后续还要多次调取不同答题人的数据,优先选这个方案:把全量分组结果缓存到内存,后续每次取数不需要重新遍历全量列表,整体查询效率更高。
// 替换为你实际需要查询的答题人ID值,注意类型需与quemRespondeu属性完全一致 var targetUserId = 123; var targetUserAnswers = surveyAnswers.Respostas .GroupBy(x => x.quemRespondeu) // 匹配对应ID的分组,空值场景兜底返回空列表,避免空引用异常 .FirstOrDefault(group => group.Key == targetUserId)? .ToList() ?? new List<SurveyAnswer>();
如果之前已经把全量分组的结果存在内存变量里,直接复用即可,不要重复跑GroupBy逻辑增加遍历开销:
// 你之前已经生成的分组结果 var groupedSurveyData = surveyAnswers.Respostas.GroupBy(x => x.quemRespondeu); // 从已有分组结果直接取目标列表 var targetUserAnswers = groupedSurveyData .FirstOrDefault(group => group.Key == targetUserId)? .ToList() ?? new List<SurveyAnswer>();
方式2:直接条件筛选(适合仅查询单个/少量用户的场景,性能更优)
如果你只是临时查询某一个/极少几个答题人的数据,不需要拆分所有分组,选这个方案更划算:直接遍历全量数据筛出匹配项,省去全量分组的临时内存开销,当全量答卷数据量很大的时候,性能优势会非常明显。
var targetUserId = 123; var targetUserAnswers = surveyAnswers.Respostas .Where(item => item.quemRespondeu == targetUserId) .ToList();
常见踩坑提示:匹配ID的时候一定要保证类型完全一致,比如
quemRespondeu是Guid类型就传入对应Guid值,是字符串就传字符串,否则会出现匹配不到、返回空列表的问题。
内容的提问来源于stack exchange,提问作者Guilherme Ornelas
相关产品推荐
相关产品推荐

