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您遍历所有满足给定条件的记录,当您使用时,First您只需搜索满足条件的第一条记录,因此使用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();
}
于 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.students成为Dictionary<int, Student>(key is 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 回答