先上代码,以1千万记录的内存查找测试:
List<Student> stuList = new List<Student>(); Dictionary<int, Student> dictStu = new Dictionary<int, Student>(); Student student = null; for (int i = 0; i < 10000000; i++) { student = new Student(i); stuList.Add(student); dictStu.Add(i, student); } Stopwatch sw = new Stopwatch(); sw.Start(); student = dictStu[99999]; sw.Stop(); Console.WriteLine(student.ToString()); Console.WriteLine("dict={0}", sw.ElapsedMilliseconds); sw.Reset(); sw.Start(); var yieldResult = StudentResult(stuList); foreach (Student stu in yieldResult) { Console.WriteLine(stu.ToString()); } // Student s = yieldResult.First<Student>(); //Console.WriteLine(s.ToString()); sw.Stop(); Console.WriteLine("yieldResult={0}", sw.ElapsedMilliseconds); sw.Reset(); sw.Start(); foreach (Student stu in stuList) { if (stu.Age == 99999) { student = stu; break; } } sw.Stop(); Console.WriteLine("foreach={0}", sw.ElapsedMilliseconds); sw.Reset(); sw.Start(); var result = from stu in stuList where stu.Age == 99999 select stu; foreach (Student stu in result) { Console.WriteLine(stu.ToString()); } sw.Stop(); Console.WriteLine("linq={0}", sw.ElapsedMilliseconds);
static IEnumerable<Student> StudentResult(List<Student> stuList) { foreach (Student stu in stuList) { if (stu.Age == 99999) { yield return stu; } } }
执行结果
结论:
字典查找为哈希查找,性能最优,其次是foreach遍历,后依次为yield,linq
//var result = from stu in stuList
// //where stu.Age > 10 && stu.Age < 20
// select stu;
var result = stuList
.Where(r => r.Age > 10 && r.Age < 20)
.Select(r => r);