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,是的,似乎是这样。然而,我不太清楚我问的是这个问题。谢谢,这正是我想要的。我联系到的问题把我引向了错误的方向。