我对枚举器的工作方式和 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 用法的链接。
