foreach(Value v in myDictionary[key])
在这种情况下,编译器是否能够确定myDictionary [key]将始终相同并且不会在foreach的每次迭代中散列[key]?
foreach(Value v in myEnumerable.Where(s => s.IsTrue))
我知道可枚举是懒惰的,我怀疑在这种情况下,.Where只解析一次,并为foreach返回一个完整的集合,但这只是一种预感。
根据this问题判断,即使在场景1中,foreach也在执行.GetEnumerable,因此它的返回值因此使用,因此它只解析一次而不是每次迭代。
答案 0 :(得分:4)
foreach
in C# is just a syntactic sugar
foreach (V v in x) embedded-statement
扩展为
{
E e = ((C)(x)).GetEnumerator();
try {
while (e.MoveNext()) {
V v = (V)(T)e.Current;
embedded-statement
}
}
finally {
… // Dispose e
}
}
如您所见,x
仅使用一次,通过调用GetEnumerator
来获取枚举数。所以你的字典查找只会被执行一次。后来它只关心那个普查员,而不是它来自哪里。