0

私は教師とオフサイダー (同じリストから来る) で埋めようとしている教育スロットの名簿を持っています。
プログラムをそのまま実行すると、すべての教師とオフサイダーは、異なる方法で返されたにもかかわらず、同じ結果になります。
プログラムを一時停止すると、作成されていることが観察された教師またはオフサイダーは、新しい別の教師になります。 この質問には同じようなものがあるようで、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);

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)];
    }
}

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)];
    }
}

注: 現在、どちらの関数も HaventTaught リストから返されます。

4

1 に答える 1

2

問題は、呼び出しごとに新しいRandomインスタンスを作成している可能性があります。これをすばやく呼び出すと、ランダムインスタンスはすべて同じシードでシードされ、呼び出しごとに同じ値を返します。

インスタンスをクラスレベルの変数に移動することをお勧めします。これにより、Randomインスタンスが1回作成され、このメソッドを連続して複数回呼び出すと、より多くの「ランダム」値が提供されます。

于 2012-06-16T00:29:36.527 に答える