我对Enumerators和LINQ的工作方式有疑问。考虑以下两个简单选择:
List<Animal> sel = (from animal in Animals
join race in Species
on animal.SpeciesKey equals race.SpeciesKey
select animal).Distinct().ToList();
要么
IEnumerable<Animal> sel = (from animal in Animals
join race in Species
on animal.SpeciesKey equals race.SpeciesKey
select animal).Distinct();
我更改了原始对象的名称,以使其看起来像一个更通用的示例。查询本身不是那么重要。我想问的是:
foreach (Animal animal in sel) { /*do stuff*/ }
我注意到,如果我使用
IEnumerable
,当我调试并检查“ sel”(在这种情况下为IEnumerable)时,它具有一些有趣的成员:“ inner”,“ outer”,“ innerKeySelector”和“ outerKeySelector”,最后两个出现成为代表。“内部”成员中没有“动物”实例,而是“物种”实例,这对我来说很奇怪。“外部”成员确实包含“动物”实例。我假设这两个代表确定哪个进出什么?我注意到,如果我使用“ Distinct”,则“ inner”包含6个项目(这是不正确的,因为只有2个是Distinct),但是“ outer”确实包含正确的值。同样,可能委托方法确定了这一点,但这比我对IEnumerable的了解还多。
最重要的是,这两个选项中哪个是性能最佳的?
邪恶列表转换通过.ToList()
?
还是直接使用枚举器?
如果可以的话,也请稍作解释或抛出一些链接来解释IEnumerable的用法。