foreach什么时候解决容器?

时间:2015-07-23 20:34:39

标签: c# .net foreach

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,因此它的返回值因此使用,因此它只解析一次而不是每次迭代。

1 个答案:

答案 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来获取枚举数。所以你的字典查找只会被执行一次。后来它只关心那个普查员,而不是它来自哪里。