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