从表中获取随机项目,无需重复

本文关键字:项目 获取 随机 | 更新日期: 2023-09-27 17:55:16

我正在创建一个应用程序,我必须在其中显示列表中的问题而不重复。

public IEnumerable<dynamic> GetQue()
{
    var result = obj.tblQuestions
        .OrderBy(r => Guid.NewGuid())
        .Select(o => new { o.id, o.Question, o.Opt1, o.Opt2, o.Opt3, o.Opt4 })
        .Take(1);
    return result;
}

目前我收到一个随机问题,但重复。如何在不重复的情况下获得记录?

从表中获取随机项目,无需重复

正如我在评论中所说,您可以使用随机获取一个一个元素,然后从列表中删除所选元素。重复此操作,直到列表为空。

我并没有给你的案例所需的代码,你仍然需要根据你的类来调整它,但这是它应该尊重的原则:

var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int randomId;
Random rand = new Random();
if (list.Count != 0)
{
        randomId = rand.Next(list.Count);
        var randomElement = list[randomId];
        list.RemoveAt(randomId);
        return randomElement;
}

这会从整数列表中获取随机元素,考虑到您的列表是类旁边的数据,当然不是您应该更新的数据。

public ActionResult GetNextQuestion(int[] prevs = null)
{
    var que = GetQue(prevs);
    var ids = new int[] { que.id};
    if(prevs != null)
        ids = ids.Concat(prevs);
    ViewBag.list = ids;
    return View(que);
}

public dynamic GetQue(int[] prevs = null)
{
    using (var obj = new Db())
    {
        var result = obj.tblQuestions;
        if(prevs != null)
           result = result.Where(e => !prevs.Contains(e.id));
        result = result.OrderBy(r => new Guid())
                       .Select(o => new { o.id, o.Question, o.Opt1, o.Opt2, o.Opt3, o.Opt4 });
        return result.First();
    }
}

来源:如何在 C# 中使用随机类来避免数字重复?

如果在循环时将项目添加到列表中,则可以检查列表以查看其是否已添加。我是菜鸟,所以我不能真正为你编写代码,但想法就在那里。为已经循环浏览的条目创建一个单独的列表,然后执行 if 语句以在执行之前检查下一个条目是否在列表中。

我会在评论中这样做,但我没有 50 次代表,所以我无法启动评论链。