【问题标题】:How can Linq be so incredibly fast? C#Linq 怎么能这么快? C#
【发布时间】:2020-03-30 23:10:25
【问题描述】:

假设我有 100 000 个 Person 类型的对象,其中有一个日期属性,其中包含他们的生日。

我将所有对象放在List<Person>(或数组)和字典中,其中我将日期作为键,每个值都是一个数组/列表,其中包含相同生日的人。

然后我这样做:

DateTime date = new DateTime(); // Just some date
var personsFromList = personList.Where(person => person.Birthday == date);
var personsFromDictionary = dictionary[date];

如果我运行 1000 次 Linq .Where 查找最终将比字典快得多。这是为什么?这对我来说似乎不合逻辑。结果是否在后台缓存(并再次使用)?

【问题讨论】:

  • .Where 还没有遍历列表,它只是准备了一个迭代器。添加 .ToList() 或 .First() 以获得更好的比较
  • Lambda 表达式只有在你执行例如 .ToList() 时才会被评估。参见例如stackoverflow.com/questions/6794555/…
  • 什么意思? int[] array = new int[] { 4, 6, 8, 4, 9 }; IEnumerable<int> fours = array.Where(x => x == 4); fours.Count(); // 2 elements 当我这样做时,结果存储在变量“fours”中?
  • fours.Count() 是对 IEnumerable 的迭代,由 .Where() 调用准备

标签: linq dictionary


【解决方案1】:

来自Introduction to LINQ Queries (C#) (The Query)

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

这被称为deferred execution.(稍后在同一页面下):

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

某些 linq 方法必须迭代 IEnumerable,因此将立即执行 - 诸如 CountMaxAverage 等方法 - 所有聚合方法。

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

【讨论】:

    猜你喜欢
    • 2016-03-19
    • 2010-09-13
    • 1970-01-01
    • 2013-02-15
    • 2020-12-19
    • 2011-06-02
    • 2012-03-18
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多