【问题标题】:Trying to create a unique random number. If number exits in database generate again and add value to database试图创建一个唯一的随机数。如果数据库中存在数字,则再次生成并向数据库添加值
【发布时间】:2020-11-05 16:48:46
【问题描述】:

我正在尝试创建一个唯一的随机数。如果数据库中存在随机数,则再次循环该代码块,直到找到不存在的数字。将值保存到数据库。对此的任何帮助都会很棒。谢谢。

public IHttpActionResult BookMatch(int id)
{
    Guid guid = Guid.NewGuid();

    var user = User.Identity.GetUserId();
    var getuser = db.AspNetUsers.Find(user);
    var match = db.Matches.Find(id);

    Random rnd = new Random();
    var peg = rnd.Next(match.PegRangeMin, match.PegRangeMax);

    var alreadyExists = db.Pegs.Any(x => x.MatchId == match.Id && x.PegNo == peg);

    if (alreadyExists == true)
    {
        //do something
    }

    var result = new Booked()
    {

        MatchId = id,
        BookerId = user,
        TicketNo = guid.ToString(),
        //pegNo = randompeg
    };

    db.Bookeds.Add(result);
    db.SaveChanges();

    if (result == null)
    {
        throw new Exception();
    }

    var getmatch = db.Matches.Find(id);

        var body = "<p>Email From: {0} ({1}) </p>" +
                   "<h3>Match Booking Confirmation:</h3>" +
                   "<b>Ticket Number:</b><p> {2} </p>" +
                   "<b>Venue:</b><p> {3} </p>" +
                   "<b>date and time:</b><p>{4}</p>";

        var message = new MailMessage();
        message.To.Add(new MailAddress(getuser.Email));
        message.From = new MailAddress("nicholas.mciver@Activeplan.co.uk");
        message.Subject = "Matchbooker Confirmation Email";
        message.Body = string.Format(body, getuser.GetFullName(), getuser.Email,
            result.TicketNo, getmatch.Fishery.Name, getmatch.DateTime);
        message.IsBodyHtml = true;

        using (var smtp = new SmtpClient())
        {
            smtp.Send(message);
        }

    return Ok();
}

【问题讨论】:

  • 你可以做一个递归函数(一个调用自己的函数)。生成一个数字并检查数据库。如果生成的数字存在于数据库中,请递归调用您的函数。如果不存在,可以插入到DB中,退出函数。
  • 你要么循环要么使用递归(就像@NolanBradshaw 建议的那样)。目前你抛出一个异常,这将阻止重试。
  • 如果在您确定某个号码仍然可用之后,另一个用户添加了这个号码,您将参加比赛。根据您使用的 DBMS,使用存储过程可能会更好。

标签: c# asp.net-mvc random


【解决方案1】:

最简单的方法是在while (true) 循环中进行数字生成和检查:

int peg;

while (true)
{
    peg = rnd.Next(match.PegRangeMin, match.PegRangeMax);

    var alreadyExists = db.Pegs.Any(x => x.MatchId == match.Id && x.PegNo == peg);

    if (!alreadyExists) break;
}

这并不完美,因为如果取完所有可能的数字,循环将永远不会中断。但这在实践中可能不是问题,只要 min-max 范围足够大。

【讨论】:

  • 感谢您的帮助,我能够通过继续而不是休息来完成我想做的事情。如果该号码存在于数据库中,则继续,直到找到一个不在数据库中的号码。然后我用这个方法创建了一个递归函数。谢谢你的帮助。 @Theodor Zoulias
  • @NicholasMcIver 你可能在某个地方有一个break,否则循环将永远持续下去。 :-)
  • 如果 matchId 中所有可能的号码都存在,如果我无法在 UI 中进行预订怎么办?
  • @NicholasMcIver 好的,你有一个 return 而不是 break。 :-) 顺便说一句,我建议将 Random 的创建移到循环之外。查看here 了解原因。
  • @NicholasMcIver 如果所有数字都被取了,那么你有一个大问题。循环将永远旋转!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 2015-08-15
  • 2015-04-15
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
相关资源
最近更新 更多