C# 正在尝试创建唯一的随机数。若数据库中存在数字,则再次生成并向数据库添加值
我试图创建一个唯一的随机数。如果数据库中存在随机数,则再次循环代码块,直到找到一个不存在的数字。将值保存到数据库。这方面的任何帮助都会很好。多谢各位C# 正在尝试创建唯一的随机数。若数据库中存在数字,则再次生成并向数据库添加值,c#,asp.net-mvc,random,C#,Asp.net Mvc,Random,我试图创建一个唯一的随机数。如果数据库中存在随机数,则再次循环代码块,直到找到一个不存在的数字。将值保存到数据库。这方面的任何帮助都会很好。多谢各位 public IHttpActionResult BookMatch(int id) { Guid guid = Guid.NewGuid(); var user = User.Identity.GetUserId(); var getuser = db.AspNetUsers.Find(user); var ma
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();
}
public IHttpActionResult BookMatch(int id)
{
Guid=Guid.NewGuid();
var user=user.Identity.GetUserId();
var getuser=db.AspNetUsers.Find(用户);
var match=db.Matches.Find(id);
随机rnd=新随机();
var peg=rnd.Next(match.PegRangeMin,match.PegRangeMax);
var alreadyExists=db.Pegs.Any(x=>x.MatchId==match.Id&&x.PegNo==peg);
if(alreadyExists==true)
{
//做点什么
}
var结果=新预订()
{
匹配id=id,
BookerId=用户,
TicketNo=guid.ToString(),
//pegNo=随机PEG
};
db.Bookeds.Add(结果);
db.SaveChanges();
如果(结果==null)
{
抛出新异常();
}
var getmatch=db.Matches.Find(id);
var body=“电子邮件发件人:{0}({1})”+
“比赛预订确认:”+
“票号:{2}”+
“地点:{3}”+
“日期和时间:{4}”;
var message=new MailMessage();
message.To.Add(新邮件地址(getuser.Email));
message.From=新邮件地址(“nicholas。mciver@Activeplan.co.uk");
message.Subject=“Matchbooker确认电子邮件”;
message.Body=string.Format(Body,getuser.GetFullName(),getuser.Email,
result.TicketNo、getmatch.Fishery.Name、getmatch.DateTime);
message.IsBodyHtml=true;
使用(var smtp=new SmtpClient())
{
smtp.Send(message);
}
返回Ok();
}
最简单的方法是在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;
}
这并不完美,因为如果所有可能的数字都被取下,循环将永远不会中断。但是,如果最小-最大范围足够大,这在实践中可能不是问题。您可以创建一个递归函数(一个调用自身的函数)。生成一个数字并检查数据库。如果数据库中存在生成的数字,则递归调用函数。如果它不存在,您可以插入DB并从函数返回。您可以循环,也可以使用递归(如@NolanBradshaw所建议的)。当前,您抛出一个异常,该异常将阻止重试。如果在您确定某个号码仍然可用后,另一个用户添加了该号码,则您将获得一场比赛。根据您使用的DBMS的不同,使用存储过程可能更好。为此,我能够通过继续而不是中断来完成我希望完成的任务。如果该号码存在于数据库中,则继续,直到找到不在数据库中的号码为止。然后我用这个方法创建了一个递归函数。谢谢你的帮助@西奥多Zoulias@NicholasMcIver您可能在某个地方有一个
中断
,否则循环将永远继续。:-)如果所有可能的号码都与matchId一起存在,那么如果我在UI中使预订无法进行,该怎么办?@NicholasMcIver好的,您有一个返回而不是中断:-)顺便说一句,我建议将Random
的创建移到循环之外。寻找原因的解释。@NicholasMcIver如果所有的数字都记下了,那么你就有大问题了。循环将永远旋转!