Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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# 列表参考问题(怀疑LINQ)_C#_Linq - Fatal编程技术网

C# 列表参考问题(怀疑LINQ)

C# 列表参考问题(怀疑LINQ),c#,linq,C#,Linq,我有一份教师和兼职教师的名单(来自同一名单)。 如果我直接运行该程序,所有教师和非教师最终都是一样的,尽管他们从不同的方法返回。 如果我暂停课程,任何被观察到被创建的老师或局外人都将是一个新的、不同的老师。 这个问题似乎有一些类似的东西,这导致我怀疑我误解了linq的一个重要部分,当查询完成时,但我不明白即使是在两个函数之间,这是如何发生的。 下面是调用代码以及2个函数。我很感激你能提供的任何见解 呼叫代码: Teacher T = list.GetTeacher(lesson); lesson

我有一份教师和兼职教师的名单(来自同一名单)。
如果我直接运行该程序,所有教师和非教师最终都是一样的,尽管他们从不同的方法返回。
如果我暂停课程,任何被观察到被创建的老师或局外人都将是一个新的、不同的老师。 这个问题似乎有一些类似的东西,这导致我怀疑我误解了linq的一个重要部分,当查询完成时,但我不明白即使是在两个函数之间,这是如何发生的。
下面是调用代码以及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);
GetTeacher:

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)];
    }
}
公共教师获取教师(课程)
{
列出符合条件的=教师。其中(t1=>t1.Active&&t1.Styles.Any(ts1=>ts1.Style==lessure.Style.Style&&ts1.Level>=lessure.Style.Level)).ToList();
如果(合格的.Count==0)
抛出新的ArgumentException(“没有这种风格和/或级别的教师”);
List haventsteached=qualified.Where(t=>!t.DatesTaught.Any(dt=>dt.AddDays(21.Day
GetOffsider:

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)];
    }
}
公共教师GetOffsider(课程)
{
如果(lesson.Teacher==null)
{
抛出新参数(“必须在越位者之前指派一名教师上课”);
}
列出符合条件的=教师。其中(t2=>t2.Active和&t2.Style.Any(ts2=>ts2.Style==lessure.Style.Style和&ts2.Level>=lessure.Style.Level)).ToList();
//消除利益冲突
合格=合格。其中(t3=>!t3.Avoid.Any(n2=>n2.Equals(lesson.Teacher.Name))&&!lesson.Teacher.Avoid.Any(n4=>n4.Equals(t3.Name)).ToList();
如果(合格的.Count==0)
抛出新的ArgumentException(“该样式和/或级别没有任何外部因素”);
List haventsteached=qualified.Where(t4=>!t4.DatesTaught.Any(dt2=>dt2.AddDays(21.Day

注意:这两个函数当前都从haventsteached列表返回。

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


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

请参见“”。这个问题非常常见。@KirkWoll,是的,似乎是这样。然而,我不太清楚我问的是这个问题。谢谢,这正是我想要的。我联系到的问题把我引向了错误的方向。