我对枚举器和 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" 时,它有一些有趣的成员: "inner"、 "outer"、 "innerKeySelector" 和 "outerKeySelector",其中最后两个似乎是委托。 "inner" 成员中没有 "Animal" 实例,而是 "Species" 实例,这对我来说非常奇怪。 "outer" 成员包含 "Animal" 实例。 我想这两个委托决定了哪个进去,哪个出来?我发现如果我使用 "Distinct",则 "inner" 包含6个项目(这是不正确的,因为只有2个项目是Distinct),但是 "outer" 包含正确的值。 再次说明,可能是委托方法决定了这一点,但这比我所知道的IEnumerable多一些。
最重要的是,哪个选项在性能方面更好?
通过.ToList()
转换为邪恶的列表?
还是直接使用枚举器?
如果可以的话,请解释一下或提供一些解释使用IEnumerable的链接。
IEnumerable<T>
在第一部分之后将成为LINQ-To-Objects,这意味着所有被发现的内容都必须返回才能运行Feline。另一方面,IQueryable<T>
将允许查询被细化,仅拉取Spotted Felines。 - Nate