在C#中使用Random,在两个表之间循环



感谢大家的评论和回答,我有这个每月员工轮班的项目,我写了一些代码,但我做错了一些事情,比如一些员工在同一个月重复,这是不应该发生的。我在名为"EmployeeTB"的表中有100多名员工,我想把他们放在"ShiftTB"中,其中包含一个月的轮班,当我使用Random.Next()时,一个接一个地不重复员工

这是我的代码,它生成了我的移位,它是正确的:

private void PopulateDate(DateTime FromDate, DateTime ToDate)
{
var dt1 = FromDate;
var dt2 = ToDate;
var dt = FromDate;
if (dt <= ToDate)
{
dt = dt.AddDays(-1);
while (dt2 >= dt1)
{
List<ShiftTB> ResultList = new List<ShiftTB>
{
new ShiftTB { NameOfDay = dt1.DayOfWeek.ToString(), DateOfDay = dt=dt.AddDays(1) },
};
foreach (var item in ResultList)
{
dt1 = dt1.AddDays(1);
db.ShiftTBs.InsertOnSubmit(item);
}
db.SubmitChanges();
}
}
}

这就是需要纠正的代码:

Random rnd = new Random();
PopulateDate(DateTime.Parse(txtFromDate.Text), DateTime.Parse(txtToDate.Text));
var EmpList = db.EmployeeTBs.Where(x => x.EmpType == "1" && x.Empstatus == "ok").ToList();
for (int i = 0; i < EmpList.Count; i++)
{
int x = rnd.Next(0, EmpList.Count());
var ListOfResult = db.ShiftTBs.Where(lor => lor.EmpName == null).ToList();
ListOfResult[x].EmpID = EmpList[i].EmpID;
ListOfResult[x].EmpName = EmpList[i].EmpName;
ListOfResult[x].EmpDepartment = EmpList[i].DepartmentName;
ListOfResult[x].EmpType = EmpList[i].EmpType;
}
db.SubmitChanges();

我该如何解决此问题?

如果你只需要随机化列表,你可以使用Ken-Y-N评论中提到的扩展方法(下面是简单版本的片段(

private static Random rng = new Random();  
public static void Shuffle<T>(this IList<T> list)  
{  
int n = list.Count;  
while (n > 1) {  
n--;  
int k = rng.Next(n + 1);  
T value = list[k];  
list[k] = list[n];  
list[n] = value;  
}  
}

这会执行一个伪随机洗牌,这对你来说应该足够了,如果你想坚持自己的随机性生成方法,那么只需确保你的Random标记为静态,这样如果不会抓取相同的种子等。

有了以上内容,您可以像这样构建代码:

PopulateDate(DateTime.Parse(txtFromDate.Text), DateTime.Parse(txtToDate.Text));
var EmpList = db.EmployeeTBs.Where(x => x.EmpType == "1" && x.Empstatus == "ok").ToList();
EmpList.Shuffle();
var ListOfResult = db.ShiftTBs.Where(lor => lor.EmpName == null).ToList();
for (int i = 0; i < ListOfResult.Count; i++)
{
var empId = i % EmpList.Count;
ListOfResult[i].EmpID = EmpList[empId].EmpID;
ListOfResult[i].EmpName = EmpList[empId].EmpName;
ListOfResult[i].EmpDepartment = EmpList[empId].DepartmentName;
ListOfResult[i].EmpType = EmpList[empId].EmpType;
}
db.SubmitChanges();

这是假设您希望对员工列表进行洗牌,然后尽可能均匀地将其隔开,如果您希望在列表洗牌后完全随机,您也可以作为员工id进行Random.Next()调用,但这取决于您。和往常一样,我不知道你的确切问题和目标,所以对持怀疑态度

我得到了答案:

Random rnd=new Random();
var EmpList = db.EmployeeTBs.Where(x => x.EmpType == "1" && x.Empstatus == "ok").ToList();
int n = EmpList.Count;
While (n>1){
n--;
int k = rnd.Next(n+1);
var value = EmpList[k];
EmpList[k] = EmpList[n];
EmpList[n] = value;
}
var ListOfResult = db.ShiftTBs.Where(lor => lor.EmpName == null).ToList();
for (int i = 0; i < ListOfResult.Count; i++)
{
var empId = i % EmpList.Count;
ListOfResult[i].EmpID = EmpList[empId].EmpID;
ListOfResult[i].EmpName = EmpList[empId].EmpName;
ListOfResult[i].EmpDepartment = EmpList[empId].DepartmentName;
ListOfResult[i].EmpType = EmpList[empId].EmpType;
}
db.SubmitChanges();

最新更新