例如

myEnumerable.Where(v => v != myDictionary["someKey"])


调用此查询时,执行的是myDictionary["someKey"]语句(这意味着要查询字典的键)或myDictionary["someKey"]的结果
第一次迭代后使用?

最佳答案

myDictionary["someKey"]的结果将不会被缓存(*请参见下面的编辑),它将在myEnumerable的每个项目上访问。但是,您仍然可以手动对其进行缓存:

var someValue = myDictionary["someKey"];
myEnumerable.Where(v => v != someValue)


还要注意,如果您打算多次遍历/访问该IEnumerable,最好通过ToList()实现它。或者,执行将每一次推迟。

var query = myEnumerable.Where(v => v != myDictionary["someKey"]);

foreach (var item in query) { /* ... */}
foreach (var item in query) { /* ... */}


在上面的示例中,Where子句执行两次。



编辑:正如@LucasTrzesniewski所指出的,这仅适用于LINQ-to-Objects。这是因为查询是在内存中评估的。但是,对于LINQ-to-Entities,它有点不同,因为该查询将转换为SQL查询,然后在数据库中执行以避免往返。

关于c# - 在LINQ中使用时,是否在每次迭代中都重新计算一条语句?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37331554/

10-11 16:15