【问题标题】:using Random in c# with loop between 2 table在 C# 中使用 Random 在 2 个表之间循环
【发布时间】:2022-10-04 16:06:53
【问题描述】:

谢谢大家的评论和回答我有这个项目是为员工每月轮班, 我写了一些代码,但我得到了一些不正确的东西,比如一些员工在同一个月重复,这是错误的,所以我有更多 我的桌子上有 100 名员工,叫做 EmployeeTB,我想把他们放在 ShiftTB 中,当我使用随机函数时,这只是一个月的时间,而不是重复

这是生成我的日期和日期的代码,它是正确的:

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();

我能得到正确的代码吗?

【问题讨论】:

标签: c# asp.net list loops random


【解决方案1】:

如果您只需要随机列表,您可以使用一种扩展方法,例如 Ken-Y-N 的评论中提到的方法(下面的简单版本为 sn-p)

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();

这是假设您希望对员工列表进行改组,然后将它们尽可能均匀地分开,如果您希望在列表改组后完全随机,您也可以将 Random.Next() 调用作为员工 ID,但它已经完成了给你。 与往常一样,我不知道您的确切问题和目标,因此请谨慎对待

【讨论】:

  • 感谢您的回答,但我在 EmpList.Shuffle() 上遇到错误;我的问题是:我有超过 100 名员工,我想在每个月的几天分配他们,这样他们就不会在这个月重复
【解决方案2】:

我得到了答案:

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();

【讨论】:

    猜你喜欢
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多