У меня есть некоторые сомнения по поводу того, как работают счетчики и 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», «external», «innerKeySelector» и «outerKeySelector», эти последние 2 появляются быть делегатами. «Внутренний» член не имеет экземпляров «Animal», а содержит «Species», что было очень странно для меня. «Внешний» член содержит экземпляры «Animal». Я предполагаю, что два делегата определяют, что входит и что выходит из этого?Я заметил, что если я использую «Distinct», «inner» содержит 6 элементов (это неверно, так как только 2 являются Distinct), но «external» действительно содержит правильные значения. Опять же, вероятно, делегированные методы определяют это, но это немного больше, чем я знаю об IEnumerable.
Самое главное, какой из двух вариантов является лучшим с точки зрения производительности?
Злой Конвертация Списка через .ToList()
?
Или, может быть, использовать перечислитель напрямую?
Если вы можете, пожалуйста, объясните немного или добавьте несколько ссылок, которые объясняют это использование IEnumerable.