Linq 林克怎么能跑得这么快?C

Linq 林克怎么能跑得这么快?C,linq,dictionary,Linq,Dictionary,假设我有100000个Person类型的对象,其中有一个日期属性,其中有生日 我把所有的对象放在一个列表或数组中,也放在一个字典中,在字典中我把日期作为键,每个值都是一个数组/列表,其中有相同生日的人 然后我会这样做: DateTime date = new DateTime(); // Just some date var personsFromList = personList.Where(person => person.Birthday == date); var personsF

假设我有100000个Person类型的对象,其中有一个日期属性,其中有生日

我把所有的对象放在一个列表或数组中,也放在一个字典中,在字典中我把日期作为键,每个值都是一个数组/列表,其中有相同生日的人

然后我会这样做:

DateTime date = new DateTime(); // Just some date
var personsFromList = personList.Where(person => person.Birthday == date);
var personsFromDictionary = dictionary[date];
如果我运行1000倍的Linq.Where查找,最终会比字典快得多。为什么呢?我觉得这似乎不合逻辑。结果是否被缓存并在后台再次使用?

来自

。。。重要的一点是,在LINQ中,查询变量本身不执行任何操作,也不返回任何数据。它只存储在稍后执行查询时生成结果所需的信息

这被称为同一页后面的内容:

如前所述,查询变量本身仅存储查询命令。查询的实际执行被延迟,直到您在foreach语句中迭代查询变量。这个概念被称为延迟执行

一些linq方法必须迭代IEnumerable,因此将立即执行所有聚合方法,如Count、Max、Average等


强制立即执行的另一种方法是使用ToArray或ToList,它将执行查询并将其结果存储在数组或列表中。

。如果尚未循环列表,它只准备一个迭代器。添加.ToList或.First以进行更好的比较只有在执行例如ToList时才会计算NLAMBDA表达式。你是什么意思?int[]数组=新的int[]{4,6,8,4,9};IEnumerable fours=数组,其中x=>x==4;四。计数;//当我这样做时,有2个元素将结果存储在变量fours中?fours.Count是迭代.Where调用准备的IEnumerable的元素