У меня есть некоторые сомнения в том, как работают перечислители и LINQ. Рассмотрим эти два простых варианта выбора:
List<Animal> sel = (from animal in Animals
join race in Species
on animal.SpeciesKey equals race.SpeciesKey
select animal).Distinct().ToList();
or
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", "external", "innerKeySelector" и "outerKeySelector", последние 2 кажутся делегатами. «Внутренний» член не содержит экземпляров «Animal», а скорее экземпляров «Species», что было для меня очень странно. «Внешний» член действительно содержит экземпляры «Animal». Я предполагаю, что два делегата определяют, что входит, а что выходит?Я заметил, что если я использую «Distinct», «внутренний» содержит 6 элементов (это неверно, поскольку только 2 являются Distinct), но «внешний» действительно содержит правильные значения. Опять же, вероятно, делегированные методы определяют это, но это немного больше, чем я знаю об IEnumerable.
Самое главное, какой из двух вариантов является лучшим с точки зрения производительности?
Преобразование злого списка через .ToList()
?
Или, может быть, напрямую использовать перечислитель?
Если вы можете, пожалуйста, также немного объясните или добавьте несколько ссылок, которые объясняют использование IEnumerable.