Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在尝试创建唯一的随机数。若数据库中存在数字,则再次生成并向数据库添加值_C#_Asp.net Mvc_Random - Fatal编程技术网

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如果所有的数字都记下了,那么你就有大问题了。循环将永远旋转!