列表引用问题(疑似 LINQ)

本文关键字:LINQ 疑似 引用 问题 列表 | 更新日期: 2023-09-27 18:37:18

我有一个教学名册,我试图用老师和越位者(来自同一个列表)填补。
如果我直接运行该程序,所有教师和越位者最终都是一样的,尽管他们从不同的方法返回。
如果我暂停程序,观察到创建的任何老师或越位者都将是一个新的、不同的老师。这个问题似乎有类似的内容,这导致我怀疑我误解了 linq 的一个重要部分,以及查询何时完成,但我不明白即使在 2 个函数中也会发生这种情况。
调用代码以及 2 个函数如下所示。感谢您提供的任何见解。

区号:

Teacher T = list.GetTeacher(lesson);
lesson.SetTeacher(T);
lesson.Teacher.AddLesson(lesson);
Teacher O = list.GetOffsider(lesson);
lesson.SetOffsider(O);
lesson.Offsider.AddLesson(lesson);

获取老师:

public Teacher GetTeacher(Lesson lesson)
{
    List<Teacher> Eligible = Teachers.Where(t1 => t1.Active && t1.Styles.Any(ts1 => ts1.Style == lesson.Style.Style && ts1.Level >= lesson.Style.Level)).ToList();
    if (Eligible.Count == 0)
        throw new ArgumentException("Don't have any teachers for that style and/or level");
    List<Teacher> HaventTaught = Eligible.Where(t => !t.DatesTaught.Any(dt => dt.AddDays(21).Day < DateTime.Now.Day)).ToList();
    if (HaventTaught.Count == 0)
    {
        Random r = new Random();
        return Eligible[r.Next(Eligible.Count)];
    }
    else
    {
        Random r = new Random();
        return HaventTaught[r.Next(HaventTaught.Count)];
    }
}

越位者:

public Teacher GetOffsider(Lesson lesson)
{
    if (lesson.Teacher == null)
    {
        throw new ArgumentNullException("Must assign a Teacher to a lesson before an Offsider");
    }
    List<Teacher> Eligible = Teachers.Where(t2 => t2.Active && t2.Styles.Any(ts2 => ts2.Style == lesson.Style.Style && ts2.Level >= lesson.Style.Level)).ToList();
    //remove conflicts of interest
    Eligible = Eligible.Where(t3 => !t3.Avoid.Any(n2 => n2.Equals(lesson.Teacher.Name)) && !lesson.Teacher.Avoid.Any(n4 => n4.Equals(t3.Name))).ToList();
    if (Eligible.Count == 0)
        throw new ArgumentException("Don't have any offsiders for that style and/or level");
    List<Teacher> HaventTaught = Eligible.Where(t4 => !t4.DatesTaught.Any(dt2 => dt2.AddDays(21).Day < DateTime.Now.Day)).ToList();
    if (HaventTaught.Count == 0)
    {
        Random r = new Random();
        return Eligible[r.Next(Eligible.Count)];
    }
    else
    {
        Random r = new Random();
        return HaventTaught[r.Next(HaventTaught.Count)];
    }
}

注意:这两个函数目前都从HaventTeach Lists返回。

列表引用问题(疑似 LINQ)

问题可能是您在每次调用中创建一个新的Random实例。 如果快速调用此参数,则 Random 实例都将使用相同的种子进行种子设定,并且每次调用都返回相同的值。

我建议将Random实例移动到类级变量中,这将导致它被构造一次,并在连续多次调用此方法时提供更多的"随机"值。