优化此LINQ查询

时间:2012-06-27 16:28:15

标签: c# performance linq

我遇到了这个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秒

3 个答案:

答案 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.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,你可以随时保持字典并行

或者,您可以在1000次迭代循环之前创建一个临时字典(this.students.ToDictionary(student => student.StudentId))。