看着Reflector at Enumerable.JoinIterator,似乎整个inner(第二个)序列被加载到内存中(进入a Lookup),但是outer(第一个)序列然后被流式传输(即不是全部加载到内存中).
如果inner序列太大而无法适应内存,似乎没有任何巧妙的事情发生.
在涉及输入序列的使用方式时,真正的Join运算符使用与Except和Intersect相同的行为:
...
当第一次在结果序列上调用MoveNext时,它会立即消耗整个内部序列,并对其进行缓冲.
外部序列是流式的 - 它一次只能读取一个元素.当结果序列开始产生外部第二个元素的结果时,它就忘记了第一个元素.