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

