1

この LINQ クエリでパフォーマンスの問題が発生しています。データはすでに this.students に読み込まれています。GetStudentData 関数を 1000 回呼び出すと、大きなオーバーヘッドが発生します。LINQ をループに変更せずにこれを改善する方法はありますか

   public Student GetStudentData()
   {         
          IEnumerable<Students> studentTypes = this.students.Where(x => (x.studentsId  == studentId && x.StduentType.Equals(studentType)));
          if(studentTypes.Count==0) return new Student() { studentid=studentID};
          return (Student)studentTypes.First();
   }

これが私の元のバージョンで10000回ループしたときの結果です

元のバージョン: 平均で 5.6 秒 @des の新しいバージョンのコードFirstOrDefault: 3.6 秒

4

3 に答える 3

4

を使用すると、特定の条件を満たすすべてのWhereレコードをループします。使用すると、条件を満たす最初のレコードを検索するだけなので、使用すると速度が向上します。FirstFirst

public Student GetStudentData()
{         
    // get first student by id and type, return null if there is no such student
    var student = students.FirstOrDefault(i => i.studentsId == studentId && i.StudentType.Equals(studentType));

    // if student is null then return new student
    return student ?? new Student();
}
于 2012-06-27T16:31:56.210 に答える
2

問題は、このメソッドをループで、おそらく 1000 回呼び出しているという事実です。

学生IDの一覧を取得し、1000人の学生を一発で返す方法に変えてみませんか?何かのようなもの

var studentTypes = from c in this.students 
                   where studentIDs.Contains(c.StudentID)
                   select c;

StudentIDs は、必要なint[]学生 ID のリストを含む にすることができます。

于 2012-06-27T16:35:45.120 に答える
0

コードをリファクタリングしてthis.studentsDictionary<int, Student>キーはStudentId)、次のようにメソッドを再実装します。

public Student GetStudentData(int studentId, StudentType studentType) {
    Student result;
    if (this.students.TryGetValue(studentId, out result))
        if (result.StudentType.Equals(studentType)))
            return result;
    return new Student { StudentId = studentId };
}

どうしてもリファクタリングできない場合this.studentsは、いつでも辞書を並行して維持できます。

this.students.ToDictionary(student => student.StudentId)または、 1000回の反復ループの直前に一時的な辞書()を作成することもできます。

于 2012-06-27T17:08:13.620 に答える