.NET 6测验API如何随机选取5个无重复图片的问题
解决方案
要解决选中的问题不重复使用同一图片的需求,核心思路是先按图片分组,随机选择不同的图片组,再从每组中随机挑选一个问题,这样就能保证每个问题对应的图片都是唯一的。
内存处理方案(适用于数据量较小的场景)
直接在内存中对问题按图片分组后随机选取,代码简单直观:
// 获取指定测试下的所有问题,按图片分组 var questionGroups = _context.Questions .Where(q => q.Test.Id == id) .GroupBy(q => q.Picture) .ToList(); // 随机打乱分组列表,取前5个分组(如果分组数不足5则取全部) var selectedGroups = questionGroups.OrderBy(x => random.Next()).Take(5).ToList(); // 从每个选中的分组里随机选一个问题 var finalQuestionsOneToFive = selectedGroups .Select(group => group.OrderBy(x => random.Next()).First()) .ToList();
数据库层面优化方案(适用于数据量较大的场景)
如果问题数量较多,先把所有数据加载到内存会影响性能,可以拆分两步在数据库层面处理:
- 先随机选出5个不同的图片
- 针对每个选中的图片,随机选一个对应问题
// 随机获取5个不同的图片(用Guid.NewGuid()适配EF Core数据库层面排序) var selectedPictures = _context.Questions .Where(q => q.Test.Id == id) .Select(q => q.Picture) .Distinct() .OrderBy(x => Guid.NewGuid()) .Take(5) .ToList(); // 遍历选中的图片,每个图片随机选一个问题 var finalQuestionsOneToFive = new List<Question>(); foreach (var picture in selectedPictures) { var randomQuestion = _context.Questions .Where(q => q.Test.Id == id && q.Picture == picture) .OrderBy(x => Guid.NewGuid()) .FirstOrDefault(); if (randomQuestion != null) { finalQuestionsOneToFive.Add(randomQuestion); } }
注意事项
- 如果指定测试下的不同图片数量不足5个,最终返回的问题数量会少于5,你可以根据业务需求补充处理逻辑(比如提示用户图片数量不足)。
- 代码中使用的
random建议定义为类的静态字段,避免每次创建新的Random实例导致随机效果不佳。
内容的提问来源于stack exchange,提问作者Ibrahim
相关产品推荐
相关产品推荐

