例如
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/