我遇到了这个LINQ查询的性能问题。 数据已经存在于这个学生中。 现在当我调用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秒
答案 0 :(得分:4)
当您使用Where
时,您会遍历满足特定条件的所有记录,当您使用First
时,您只需搜索第一个记录fullfills条件,因此使用First
应加快速度。
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();
}
答案 1 :(得分:2)
嗯,问题恰恰在于你在一个循环中调用这个方法,据说是1000次!
为什么不改变方法来接收学生ID列表并一次性返回1000名学生?像
这样的东西var studentTypes = from c in this.students
where studentIDs.Contains(c.StudentID)
select c;
其中studentID可以是int[]
,其中包含您想要的学生ID列表。
答案 2 :(得分:0)
重构您的代码,因此this.students
为Dictionary<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
,你可以随时保持字典并行。
或者,您可以在1000次迭代循环之前创建一个临时字典(this.students.ToDictionary(student => student.StudentId)
)。